Как инвертировать матрицу 3x3, каждый элемент которой является матрицей 3x3?

Я пытаюсь реализовать фильтр Калмана для слияния данных на С++. В рамках проекта мне нужно реализовать функцию для вычисления обратной матрицы 3x3, в которой каждый элемент сам является матрицей 3x3. Не могли бы вы помочь мне решить эту проблему? Я бы предпочел решение, которое требует наименьшего количества вычислений (наиболее эффективное использование ЦП).

Также еще один вопрос, поскольку фильтр Калмана зависит от обратной матрицы, как мне поступить в случае, когда матрица необратима?

Спасибо за вашу помощь.


person Tuan Nguyen    schedule 04.02.2011    source источник
comment
Вам нужно математическое описание, прежде чем вы сможете написать компьютерную функцию. У вас есть математический алгоритм?   -  person aschepler    schedule 05.02.2011
comment
Можно ли вообще инвертировать матрицу матриц? Мне действительно интересно здесь ... Единственная возможная вещь, которую я вижу, - это инвертирование каждой из подматриц, но я действительно не знаю, будет ли это хорошо.   -  person Xeo    schedule 05.02.2011
comment
@Xeo: Хороший вопрос ... Я полагаю, что можно идентифицировать 1 с единичной матрицей 3x3, 0 с нулевой матрицей 3x3, + и * с матричным сложением и умножением соответственно. Но умножение матриц не является коммутативным, поэтому я не знаю, сработает ли алгебра. Но это заставляет меня задаться вопросом, имеет ли смысл в данном контексте просто рассматривать структуру Туана как матрицу действительных чисел 9x9, а затем инвертировать ее.   -  person Jim Lewis    schedule 05.02.2011
comment
@ Джим: Ну, зависит от того, нужна ли Туану матрица в целом или только подматрицы на самом деле ... Потому что я действительно не могу придумать ни одной ситуации, в которой вам понадобилась бы матрица матриц. Если ему нужна матрица в целом, то, я полагаю, сработает обработка ее как матрицы 9x9.   -  person Xeo    schedule 05.02.2011
comment
@aschepler: я пытаюсь использовать алгоритм для инвертирования матрицы 3x3 с использованием определителя (det) и обработки каждой подматрицы как числа, но он не работает. Поскольку каждый элемент является матрицей, определитель оказывается матрицей, а не числом.   -  person Tuan Nguyen    schedule 07.02.2011
comment
@Jim, Xeo: к сожалению, мне нужно рассматривать каждую матрицу в отдельности, а не только большую матрицу 9x9. Эта матрица используется для моделирования динамики наземного транспортного средства. Он включает положение, скорость и ускорение в направлениях на север, восток и вниз, следовательно, матрица 3x3 матриц 3x3. Вот ссылка на исходный документ, описывающий эту проблему: math. u-bordeaux1.fr/~fcaron/Публикации/   -  person Tuan Nguyen    schedule 07.02.2011


Ответы (1)


Вы можете сделать «маленькую матрицу», которая является каждым элементом «большой матрицы», которая содержит указатели на «маленькую матрицу», поэтому обращение «большой матрицы» займет столько же времени, сколько обращение нормальной матрицы целых чисел.

Вероятно, это самый быстрый алгоритм, который вы можете сделать, но подходит ли он для вашей реализации? Как объявлена ​​ваша матрица?

person BlackBear    schedule 04.02.2011
comment
моя матрица реализована аналогично вашей идее, большая матрица содержит указатели на маленькие матрицы. Затем я обращаю его, используя алгоритм обращения матрицы действительных чисел 3x3, но похоже, что это неправильно. Спасибо. - person Tuan Nguyen; 07.02.2011
comment
@Tuan Nguyen: значит, вы не получаете никаких ошибок времени выполнения / времени компиляции? Что говорит отладчик? - person BlackBear; 07.02.2011
comment
Нет, программа компилируется и работает нормально. Однако, перечитав документ фильтра Калмана еще раз, я понял, что маленькие матрицы 3x3 обрабатываются как блоки внутри большей матрицы. Таким образом, в целом большая матрица представляет собой обычную матрицу 9x9, как предложено Джимом и Ксео выше. - person Tuan Nguyen; 08.02.2011