Определители огромных матриц в MATLAB

из задачи моделирования я хочу вычислить сложные квадратные матрицы порядка 1000x1000 в MATLAB. Поскольку значения относятся к функциям Бесселя, матрицы вовсе не разрежены.

Поскольку меня интересует изменение определителя по некоторому параметру (в моем случае энергии искомой собственной функции), я преодолеваю проблему на данный момент, сначала ища коэффициент перемасштабирования для исследуемого диапазона, а затем вычисляя определители,

result(k) = det(pre_factor*Matrix{k});

Теперь это очень неудобное решение и работает только для размеров матрицы, скажем, максимум 500x500.

Кто-нибудь знает красивое решение проблемы? Взаимодействие с Mathematica может работать в принципе, но у меня есть сомнения относительно осуществимости. заранее спасибо

Роберт

Редактировать: я не нашел подходящего решения проблемы расчета, так как это потребовало бы перехода к более высокой точности. Вместо этого я использовал это

ln det M = trace ln M

то есть, когда я вывожу его относительно k

A = trace(inv(M(k))*dM/dk)

Так что у меня по крайней мере была замена логарифма определителя по k. Из физического фона проблемы я мог вывести ограничения на A, которые в конце концов дали мне обходной путь, подходящий для моей проблемы. К сожалению, я не знаю, можно ли обобщить такой обходной путь.


person Robert Filter    schedule 03.12.2010    source источник
comment
Есть ли что-то особенное в структуре вашей матрицы, что могло бы помочь? Вы упоминаете k = {A1, B1; A2, B2}, где A1, A2 симметричны. Что-нибудь еще? Коммутируют ли A1 и A2, или любая из подматриц легко обратима?   -  person Jonathan Dursi    schedule 03.12.2010
comment
@Jonathan Dursi: спасибо за вдумчивые вопросы. Но я боюсь, что вообще не вижу причин, по которым A1 и A2 должны коммутировать, а также почему любая из подматриц должна быть легко обратима. Кроме того, поскольку интересные случаи находятся вблизи det(M) = 0, обращение получается не очень хорошо.   -  person Robert Filter    schedule 03.12.2010
comment
То, что матрица вырождена, не обязательно говорит что-то интересное о подматрицах; если бы B1 и B2 были равны нулю, M не было бы обратимым, хотя A1 и A2 могли бы вести себя очень хорошо.   -  person Jonathan Dursi    schedule 04.12.2010
comment
@Jonathan Dursi: Думаю, я понимаю. Поскольку все задействованные матрицы полностью заполнены, не должно быть причин, по которым инверсия должна быть простой в вычислительном отношении.   -  person Robert Filter    schedule 04.12.2010


Ответы (4)


Если скорость не имеет значения, вы можете использовать det(e^A) = e^(tr A) и взять в качестве A некоторую константу масштабирования, умноженную на вашу матрицу (так, чтобы A - I имел спектральный радиус меньше единицы).

РЕДАКТИРОВАТЬ: В MatLab журнал матрицы (logm) вычисляется с помощью тригонализации. Поэтому вам лучше вычислить собственные значения вашей матрицы и умножить их (или лучше добавить их логарифм). Вы не указали, была ли ваша матрица симметричной или нет: если это так, найти собственные значения проще, чем если это не так.

person Alexandre C.    schedule 03.12.2010
comment
Большое спасибо за ваш анзац. Я уже пробовал это, и, поскольку я ищу локальные минимумы, использовал ln (detM) = tr (lnM) и соответствующие выражения для его производной, но, как вы указываете, это чрезвычайно медленно в вычислительном отношении. - person Robert Filter; 03.12.2010
comment
Я использовал предоставленную вами личность для решения проблемы, поэтому решил принять ваш ответ :) - person Robert Filter; 11.12.2010

Вы должны понимать, что когда вы умножаете матрицу на константу k, вы масштабируете определитель матрицы на k^n, где n — размерность матрицы. Итак, для n = 1000 и k = 2 вы масштабируете определитель на

>> 2^1000
ans =
     1.07150860718627e+301

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

>> realmax
ans =
     1.79769313486232e+308

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

person Community    schedule 03.12.2010
comment
По определению определитель — это единственное чередующееся полилинейное отображение из Mn(K) в K такое, что F(Id)=1. - person Wok; 03.12.2010
comment
Большое спасибо за ваш ответ. Детерминанты исследованных матриц действительно очень малы, достигая 1.e-300 при N ~ 200, что потребовало перемасштабирования. Есть ли у вас какие-либо предложения по преодолению ограничений двойной точности MATLAB, таких как использование Mathematica? - person Robert Filter; 03.12.2010
comment
Зачем делать масштабирование? В самом деле, зачем вообще использовать сам определитель? Работа с журналом определителя. Тогда вам никогда не придется возиться с произвольным масштабированием только для того, чтобы сохранить определитель внутри динамического диапазона арифметики с плавающей запятой. Журнал определителя легко получить из журналов диагональных элементов U, возвращаемых LU-факторизацией вашей матрицы. Остерегайтесь любых отрицательных чисел на этой диагонали, но они легко обрабатываются. - person ; 04.12.2010
comment
Спасибо за предложение. Я только что попробовал этот анзац, но оказалось, что tr(logm M) и det(M) дают те же результаты, что и должны; NaN для огромных матриц. В дальнейшем я попытаюсь перейти к длинному двойному диапазону с помощью набора инструментов MATLAB или обходного пути C/C++ и сообщу здесь, как только найду какое-то решение. - person Robert Filter; 06.12.2010

Вы сказали, что текущее значение определителя составляет около 10^-300.

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

Я бы предложил изменить столбцы или строки матрицы, а не масштабировать ее.


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

> n=100
> M=matrix(rnorm(n**2),n,n)
> det(M)
[1] -1.977380e+77
> kappa(M)
[1] 2318.188
person Wok    schedule 03.12.2010
comment
@wok: Спасибо за ответ. Действительно, матрица может быть плохо обусловленной, поскольку для изучаемой задачи я ищу параметры, при которых эта матрица имеет нулевой определитель, следовательно, по крайней мере одно собственное значение должно быть равно нулю. Вы считаете, что смотреть на детерминанты в этом смысле совсем не оправдано? - person Robert Filter; 03.12.2010
comment
Под исчезновением вы подразумеваете равенство нулю? Обладает ли матрица каким-либо особым свойством? - person Wok; 03.12.2010
comment
@wok: Да, я имею в виду det(M) = 0, что в моем случае является резонансным состоянием системы. Матрица имеет вид M = {A1 B1; А2 В2}. А симметричны, Б нет. Искренне. - person Robert Filter; 03.12.2010
comment
Не уверен, что смогу найти лучший способ сделать это. Интересно, может ли у вас быть явно ненулевой определитель с матрицами, которые вы рассматриваете. - person Wok; 03.12.2010
comment
@wok: для более низких порядков матриц я получаю правильные значения (абсолютные значения определителей, соответствующих резонансам, на несколько порядков меньше, чем для нерезонансных случаев), поэтому я предполагаю, что при увеличении разрешения я не получу принципиально другое поведение. - person Robert Filter; 03.12.2010
comment
Я понимаю, что для более низких порядков матриц означает малый размер матрицы (n‹1000), а разрешение означает коэффициент масштабирования. Я полагаю, что у вас здесь числовые ошибки, и вы не можете сделать вывод из чисел около 10 ^ -300. - person Wok; 03.12.2010
comment
Вы можете сделать SVD и сделать вывод о наличии резонанса на основе сингулярных значений. - person Wok; 04.12.2010
comment
@wok: Спасибо за ваше дальнейшее предложение. Мне нужно подумать об этом, так как у меня нет никакого опыта в этом. - person Robert Filter; 06.12.2010
comment
SVD — хорошо известная матричная факторизация. В Matlab попробуйте s = svd(X) просто получить список единственных значений. Чем меньше сингулярные значения, тем более сингулярна матрица. - person Wok; 06.12.2010

Это не строго решение для Matlab, но вы можете рассмотреть возможность использования Mahout. Он специально разработан для крупномасштабной линейной алгебры. (1000x1000 не проблема для масштабов, к которым он привык.)

Вы должны вызвать java для передачи данных в/из Махаута.

person Xodarap    schedule 03.12.2010
comment
Спасибо за ваше предложение. Проект Mahout действительно выглядит многообещающе. Безусловно, стоило бы попробовать. Но, честно говоря, мои познания в области распределенной компьютерной архитектуры (Apache Hadoop, с которым я только что столкнулся) очень ограничены, поэтому я думаю, что мне потребуется слишком много времени для настройки среды. - person Robert Filter; 03.12.2010
comment
@Robert: Hadoop может работать на многих узлах, но в этом нет необходимости. Мне потребовалось около 5 минут, чтобы настроить его для работы на моей машине. В Matlab также есть инструментарий для параллельных вычислений, если вы хотите ускорить работу Matlab (хотя Я не думаю, что это более точно). Я никогда не пробовал его, поэтому я не могу засвидетельствовать его эффективность. - person Xodarap; 03.12.2010
comment
Спасибо за вашу поддержку. Я уточню у нашего администратора, можно ли будет установить его на некоторые узлы. Тем не менее, как вы думаете, может ли Mahout сделать больше, чем двойная точность, которая, как я полагаю, потребуется для данной задачи? Я немного искал, но не смог найти информацию об этом (например, Doc-Page down atm). Искренне - person Robert Filter; 04.12.2010
comment
@Robert: хороший момент, это не похоже на Mahout. Возможно, попробуйте это ? BigDecimal — произвольная точность. - person Xodarap; 04.12.2010
comment
Спасибо за ваши ссылки. Я также немного погуглил и обнаружил, что существует множество библиотек, которые могут обрабатывать long double (которого здесь может быть достаточно) или даже произвольную точность. Я опубликую свои результаты, если я могу найти решение. - person Robert Filter; 06.12.2010