Как инвертировать матрицу матриц в Matlab?

Проблема заключается в следующем:
У меня есть набор из 20 уравнений:

r1 = s1*h1_1 + s2*h1_2 + ... s20*h1_20

r2 = s1*h2_1 + ...

...

r20 = s1*h20_1 + ...

где r, s и h — матрицы, а * символизирует поточечное произведение. Его можно переписать в матричной форме R = H*S. Я хочу решить это уравнение для S, поэтому мне нужно вычислить inv(H)*R. Но как мне вычислить inv(H), если каждый элемент H является матрицей? Я не могу просто объединить эти меньшие матрицы в большую матрицу H, а затем инвертировать ее, поскольку это даст другой результат, чем, например. инвертируя матрицу H с символическими значениями, а затем заменяя эти символьные значения меньшими матрицами (из-за поточечного произведения, присутствующего в системе уравнений).

До сих пор я придумал 1 решение. Я создам матрицу H с символьными значениями 20x20, инвертирую ее, а затем оценю каждую ячейку полученной инвертированной матрицы с помощью «subs».

H = sym('A',[20 20]);
invmat = inv(H) ;
% here I load 400 smaller matrices with appropriate names
invmat_11 = subs(invmat(1,1));

Но инверсия такой матрицы слишком сложна для расчета на любом компьютере среднего класса, поэтому мне так и не удалось запустить этот код. Знаете ли вы какой-либо другой способ вычисления обращения матрицы H или прямого решения для S?

Меня попросили привести простой пример: рассмотрим уравнение R = H*S (S неизвестно). Скажем, H=[A B; C D], где A,B,C,D — матрицы 2x2, например. A = [A11 A12; A21 A22]

и R и S представляют собой матрицы 2x1, например.

R = [R1;R2]

Чтобы вычислить S, мне нужно решить inv(H)*R, символически inv(H) =

[ -D/(B*C - A*D), B/(B*C - A*D)] [ C/(B*C - A*D), -A/(B*C - A*D)]

Теперь я могу заменить A, B, C и D реальными матрицами 2x2 и вычислить инверсию H:

inv(H) = [H1 H2; H3 H4] где

H1 = -D/(B*C - A*D)

Это составляет вычисление inv(H). Теперь мне нужно умножить inv(H) на R (чтобы найти S):

S1 = H1*R1 + H2*R2 S2 = H3*R1 + H4*R2

но обратите внимание, что все от H1 до H4 и от R1 до R2 являются матрицами, а * символизирует поточечное произведение.


person pewter_cauldron    schedule 23.07.2015    source источник
comment
Не могли бы вы добавить свое (медленное) решение вопроса. Возможно, производительность может быть увеличена с учетом этого решения. Насколько велики ваши меньшие матрицы?   -  person Daniel    schedule 23.07.2015
comment
Просто примечание - вычислять inv(H)*R неэффективно (и даже не удается, если H - дефицит ранга). Обычное решение состоит в том, чтобы решить уравнение, например. используйте mldivide, который кратко записывается как H\R   -  person bdecaf    schedule 23.07.2015
comment
@Daniel, мое медленное решение уже есть в вопросе: моему компьютеру так и не удалось вычислить H = sym('A',[20 20]); инвмат = инв(Н); Я даже пытался применить блочную инверсию ( en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion ), так что мне нужно было бы вычислить только инверсию матрицы 10x10, но это все равно занимает много памяти.   -  person pewter_cauldron    schedule 23.07.2015
comment
@bdecaf Я знаю, что mldivide намного быстрее, но я не знаю, как его применять, когда в уравнениях присутствует поточечное произведение. Это сработает, если я объединим все меньшие матрицы в большую матрицу H, но тогда результаты будут неверными.   -  person pewter_cauldron    schedule 23.07.2015
comment
Не могли бы вы добавить простой пример (скажем, матрицы 2x2) с ожидаемым результатом?   -  person bdecaf    schedule 23.07.2015
comment
@bdecaf Я добавил несколько примеров.   -  person pewter_cauldron    schedule 23.07.2015
comment
Так что для полноты R1, A1 и S1 являются матрицами 2x2? Будет ли ответ правильным, если заменить в формулах H1 и S1 умножение и деление поточечными вариантами?   -  person bdecaf    schedule 23.07.2015
comment
@bdecaf Думаю, да. Если бы при вызове функции Matlab inv Matlab поточечно умножал и поточечно делил элементы, я думаю, результаты были бы в порядке. Но проблема по-прежнему будет чрезвычайно трудоемкой.   -  person pewter_cauldron    schedule 23.07.2015
comment
так что ldivide и rdivide подойдут?   -  person bdecaf    schedule 23.07.2015
comment
Ну, технически да, но это должно быть применено к блокам матрицы H, что я не думаю, что это возможно. И еще: мой компьютер среднего класса не в состоянии решить такую ​​задачу, поэтому я тоже ищу какой-то другой способ решения этой проблемы.   -  person pewter_cauldron    schedule 23.07.2015
comment
Правильно ли я понимаю, что вам на самом деле не нужен символический результат, но вы используете его как промежуточный шаг? Думаю, вы могли бы записать это в тензорной форме. Затем вы можете использовать команду kron, чтобы получить соответствующую матрицу, которую можно решить численно.   -  person bdecaf    schedule 26.07.2015


Ответы (1)


Я нашел лучшее решение для решения этого набора уравнений. На самом деле это до неловкости просто: нужно только заметить, что эти уравнения можно переписать в виде:

first_element_of_r1 = first_element_ofs1*first_element_of_h1_1 + ...

и это связано с наличием в уравнениях кусочного произведения. Теперь каждый элемент матриц от r1 до r20 можно решать независимо в цикле (или параллельном цикле). Спасибо всем за попытку помочь мне.

person pewter_cauldron    schedule 26.07.2015