обратная большая блочно-диагональная разреженная матрица в r

Я хотел бы вычислить инверсию некоторой большой блочной диагональной разреженной матрицы. Количество строк и столбцов чуть больше 50 000. Блоки имеют размер 12 на 12 и разрежены (27 ненулевых элементов).

Я попытался вычислить инверсию всей матрицы (используя решение). Это было невозможно, вся матрица слишком большая.

После этого я использую цикл for. На каждой итерации я вынимаю один блок, вычисляю его инверсию и возвращаю обратно.

Этот метод работает, но я занимает около 5 минут. Интересно, есть ли какой-нибудь более быстрый способ.

Спасибо заранее.


person user3499209    schedule 04.04.2014    source источник
comment
Я думаю, вы могли бы спросить в scicomp.SE, но они, скорее всего, просто скажут вам не инвертировать большие матрицы. Зачем нужен обратный? Причина, по которой это так медленно, кстати, заключается в том, что удаление блоков и их установка обратно происходит медленно. Математика выполнима очень быстро.   -  person Emmet    schedule 04.04.2014
comment
вы уже используете разреженную матрицу и методы из пакета Matrix? из вашего вопроса не ясно.   -  person Ben Bolker    schedule 10.04.2014
comment
да это правда; dgCMatrix   -  person user3499209    schedule 11.04.2014


Ответы (2)


Как получить матрицу 50k x 50k?

Инвертировать 12 x 12 просто и быстро. Это инвертирование вызывает медлительность или доступ к матричному объекту?

Что ты собираешься делать со своей большой инверсией?

person user3472874    schedule 04.04.2014
comment
доступ к матричному объекту вызывает медленный... многократный выбор блока этой матрицы - person user3499209; 06.04.2014
comment
причину, по которой я хочу это сделать, не так просто объяснить... Я хочу использовать квадратичную оптимизацию. В моем распоряжении есть очень быстрый модуль для задач вида (min (x* - x)'(x*-x)), частично запрограммированный на C+. Моя проблема несколько сложнее. Оно имеет более общую форму min x'A'x + cx. Я использую обратную матрицу, чтобы преобразовать мою задачу в более легкую задачу min (x* - x)'(x*-x) ). Я знаю, что есть какой-то R-модуль Quadprog для решения более общих квадратичных программ, но он не так хорош, как моя программа для решения более простой задачи. - person user3499209; 06.04.2014

Я сделал по коду намного быстрее, по:

1) сохранение обратных блочно-диагональных матриц в списке, а не «помещение их обратно в большую матрицу». В конце я построил всю матрицу из списка с помощью команды bdiag(). 2) рассматривая блочно-диагональные матрицы не по одной, а группами примерно по 10 So, многократно вычисляю обратную подматрицу, состоящую из 10 блочно-диагональных матриц.

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

person user3499209    schedule 10.04.2014