Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обратная матрица в формате int32
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Ivan55
Добрый вечер!

Есть проблема матлаб выдает ошибку при поиске обратной матрицы заданной в формате 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);

Что можно сделать? как это обойти?
blackfin
B = eye(2000)/double(A);

или

B = double(A)^-1;

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

PS. Исправил...
Ivan55
Цитата(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
blackfin
Цитата(Ivan55 @ Dec 9 2017, 17:43) *
В итоге Е - единичная матрица
Остается вопрос что делать когда матрица задана в формате int32

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

То есть:

A = randi(1000,5,5);
D = double(A);
B = inv(D);
Ivan55
Цитата(blackfin @ Dec 9 2017, 17:48) *
Преобразовать в double, найти обратную, масштабировать, преобразовать в int?

То есть:

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

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


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

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

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


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

Есть алгоритмы, но не для произвольных матриц. Есть для эрмитовых матриц и есть для тёплицевых.
Ivan55
Препод всетаки уперся и хочет чтоб было без double

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

Но блин я даже не знаю что делать матлаб ругаетя на все на det на lu
Что делать? как найти обратную?
thermit
Что делать? Предложить преподу обратить в целых числах матрицу [1 1; 1 -1] и представить результат в формате int32.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.