Инверсия матрицы сложна в Matlab при работе с разреженной матрицей

Я реализую алгоритм, связанный с инверсией разреженной матрицы.

Код:

kapa_t=phi_t*F_x'*(inv(inv(R_t)+F_x*phi_t*F_x'))*F_x*phi_t;

Пишу код в матлабе. Это дает мне предупреждение Матрица близка к единственной или плохо масштабируется. Результаты могут быть неточными. RCOND = 4,419037e-18.. Но согласно моему алгоритму инверсия матрицы является важной частью. Итак, я пытаюсь найти какой-нибудь эффективный способ инверсии матрицы. Итак, я нахожу эту ссылку как точно вычислить обратную матрицу?
Итак, я изменил свой код, как было предложено.

kapa_t=phi_t*F_x'*(inv(inv(R_t)+F_x*phi_t*F_x'))\F_x*phi_t;

После этого я получаю сообщение об ошибке "Ошибка использование \ размеры матрицы должны быть согласованы".

Ошибка в EKF_SLAM_known (строка 105) kapa_t=phi_tF_x'(inv(inv(R_t)+F_xphi_tF_x'))\F_x*phi_t;

Я использую следующий алгоритм: введите здесь описание изображения

Здесь строка № 8 алгоритма эквивалентна коду kapa_t=phi_tF_x'(inv(inv(R_t)+F_xphi_tF_x'))F_x< /эм>фи_т;

Что мне делать с моим кодом, чтобы избавиться от этого предупреждения.


person Saswati    schedule 19.09.2018    source источник


Ответы (1)


kapa_t=phi_t*F_x'*(inv(inv(R_t)+F_x*phi_t*F_x'))\F_x*phi_t;

должно быть

kapa_t=phi_t*F_x'*((inv(R_t)+F_x*phi_t*F_x')\F_x)*phi_t;

Оператор A \ B примерно эквивалентен inv(A) * B, когда A является квадратным, поэтому вам не нужен внешний inv.

person lightalchemist    schedule 19.09.2018
comment
Спасибо. Теперь это работа. Но одно и то же предупреждение появляется снова и снова. Матрица близка к единственной или плохо масштабируется. Результаты могут быть неточными. RCOND = 4,419037e-18.. Есть ли способ остановить предупреждение. потому что у меня 40000 данных, поэтому это предупреждение будет повторяться 40000 раз. - person Saswati; 20.09.2018
comment
@Saswati Предупреждение нельзя игнорировать. Это говорит о том, что ваша инвертированная матрица (или матрицы) плохо обусловлена. Думайте об этом как о матричном эквиваленте деления на 0. Вы должны использовать функцию cond, чтобы проверить номер условия (погуглите, если не уверены) R_t и выражение в скобках, которое нужно инвертировать. Затем решите, есть ли у вас ошибка при вычислении любого из них или это связано с тем, что ваши данные делают их низкими. В противном случае есть другие хаки для улучшения их состояния (например, добавление к ним малого кратного матрицы идентичности), но это зависит от вашей проблемы. - person lightalchemist; 20.09.2018
comment
@Saswati Предупреждение не должно восприниматься как неприятность. Это говорит вам, что ваши результаты, вероятно, недействительны. Если вы не можете понять проблему, вы можете опубликовать отдельный вопрос с соответствующими частями вашего кода, особенно с теми, которые вычисляют матрицы в этом выражении. - person lightalchemist; 20.09.2018
comment
Большинство матриц, которые я использовал здесь, разрежены. Я могу создать отдельную ссылку, состоящую из размеров матриц и значений внутри нее. - person Saswati; 20.09.2018
comment
Я использую разреженную матрицу. Что именно означает использование ранга с недостатком? Не могли бы вы помочь мне понять? - person Saswati; 22.09.2018
comment
@Saswati Это просто означает, что матрица не имеет полного ранга, поэтому обратная матрица определена неправильно. Раздел комментариев не предназначен для расширенного обсуждения, поэтому, если ваши результаты выглядят некорректно, задайте другой вопрос. - person lightalchemist; 22.09.2018