реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> обратная матрица в формате int32
Ivan55
сообщение Dec 9 2017, 13:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 210
Регистрация: 17-01-12
Пользователь №: 69 640



Добрый вечер!

Есть проблема матлаб выдает ошибку при поиске обратной матрицы заданной в формате int32
CODE
A = int32(randi(1000, 2000, 2000));

% Ищем обратную матрицу
B = inv(A);


Ошибка:
Undefined function 'inv' for input arguments of type 'int32'.

Error in InversMatrix (line 6)
B = inv(A);

Что можно сделать? как это обойти?
Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 9 2017, 14:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 900
Регистрация: 18-04-05
Пользователь №: 4 261



B = eye(2000)/double(A);

или

B = double(A)^-1;

Ессно, детерминант матрицы А должен быть не равен нулю.

PS. Исправил...
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Dec 9 2017, 14:43
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 210
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(blackfin @ Dec 9 2017, 17:20) *
B = 1.0/A;


умножте B на А вы не получите единичную матрицу, а это значит что В не обратная к А
Вы получите матрицу состоящую из единиц

да и вообще если опустить пока проблему с int32
и запустить вот такой код
CODE
A = randi(10, 5, 5);

B = inv(A);
E = A.*B;

то у меня в результате почемуто не получается Е = [1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]

Цитата(Ivan55 @ Dec 9 2017, 17:27) *
CODE
A = randi(10, 5, 5);

B = inv(A);
E = A.*B;

то у меня в результате почемуто не получается Е = [1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]


извиняюсь точка не нужна тогда все норм
CODE
A = randi(10, 5, 5);

B = inv(A);
E = A*B;


В итоге Е - единичная матрица
Остается вопрос что делать когда матрица задана в формате int32

Сообщение отредактировал Ivan55 - Dec 9 2017, 14:41
Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 9 2017, 14:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 900
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Ivan55 @ Dec 9 2017, 17:43) *
В итоге Е - единичная матрица
Остается вопрос что делать когда матрица задана в формате int32

Преобразовать в double, найти обратную, масштабировать, преобразовать в int?

То есть:

A = randi(1000,5,5);
D = double(A);
B = inv(D);
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Dec 9 2017, 15:22
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 210
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(blackfin @ Dec 9 2017, 17:48) *
Преобразовать в double, найти обратную, масштабировать, преобразовать в int?

То есть:

A = randi(1000,5,5);
D = double(A);
B = inv(D);

Кстати, элементы матрицы В будут очень очень малыми числами, так что смысл подобных вычислений весьма загадочен.


впринципе вариант) спасибо
смысл действительно загадочен...

есть еще более загадочный вопрос))) как ускорить вычисление произведения матриц большой размерности в матлаб, так чтобы это выполнялось быстрее чем просто А*В
Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 9 2017, 15:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 900
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Ivan55 @ Dec 9 2017, 18:22) *
есть еще более загадочный вопрос))) как ускорить вычисление произведения матриц большой размерности в матлаб, так чтобы это выполнялось быстрее чем просто А*В

Дождаться, когда MATLAB начнет поддерживать инструкции AVX-512, ну и купить правильный процессор.. biggrin.gif
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Dec 9 2017, 15:37
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 210
Регистрация: 17-01-12
Пользователь №: 69 640



Цитата(blackfin @ Dec 9 2017, 18:29) *
Дождаться, когда MATLAB начнет поддерживать инструкции AVX-512, ну и купить правильный процессор.. biggrin.gif


biggrin.gif улыбнуло
ну а если серьезно то я толком ничего не нашел кроме алгоритма Штрассена, но его видимо надо реализовывыть на С++
и подключать к матлабу как MEX с чем я слабо знаком, может есть еще варианты менее извратные чем описал я и вы)))
Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 9 2017, 15:41
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 900
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Ivan55 @ Dec 9 2017, 18:37) *
biggrin.gif улыбнуло
ну а если серьезно то я толком ничего не нашел кроме алгоритма Штрассена, но его видимо надо реализовывыть на С++
и подключать к матлабу как MEX с чем я слабо знаком, может есть еще варианты менее извратные чем описал я и вы)))

Есть алгоритмы, но не для произвольных матриц. Есть для эрмитовых матриц и есть для тёплицевых.
Go to the top of the page
 
+Quote Post
Ivan55
сообщение Dec 19 2017, 11:24
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 210
Регистрация: 17-01-12
Пользователь №: 69 640



Препод всетаки уперся и хочет чтоб было без double

A = int32(randi(1000,5,5));
D = double(A);
B = inv(D);

Но блин я даже не знаю что делать матлаб ругаетя на все на det на lu
Что делать? как найти обратную?
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 19 2017, 12:36
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 760
Регистрация: 3-08-09
Пользователь №: 51 730



Что делать? Предложить преподу обратить в целых числах матрицу [1 1; 1 -1] и представить результат в формате int32.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th May 2018 - 05:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.00905 секунд с 7
ELECTRONIX ©2004-2016