У меня есть очень большая квадратная матрица порядка 100000, и я хочу знать, равно ли значение определителя этой матрице нулю или нет.
Что может быть самым быстрым способом узнать это?
Я должен реализовать это на С++
У меня есть очень большая квадратная матрица порядка 100000, и я хочу знать, равно ли значение определителя этой матрице нулю или нет.
Что может быть самым быстрым способом узнать это?
Я должен реализовать это на С++
Предполагая, что вы пытаетесь определить, является ли матрица несингулярной, вы можете посмотреть здесь:
Как упоминалось в комментариях, лучше всего использовать какую-то библиотеку BLAS, которая сделает это за вас, например Boost::uBLAS
.
Обычно матрицы такого размера чрезвычайно разрежены. Используйте алгоритмы переупорядочивания строк и столбцов, чтобы сконцентрировать записи рядом с диагональю, а затем используйте разложение QR или разложение LU. Произведение диагональных элементов второго множителя с точностью до знака в случае QR является определителем. Это все еще может быть слишком плохо обусловлено, лучший результат для ранга получается при выполнении разложения по сингулярным значениям. Однако СВД дороже.
Существует свойство, согласно которому, если любые две строки равны или одна строка постоянно кратна другой строке, мы можем сказать, что определитель этой матрицы равен нулю. Это применимо и к столбцам.
Насколько мне известно, вашему приложению не нужно вычислять определитель, но ранга матрицы достаточно, чтобы проверить, имеет ли система уравнений нетривиальное решение: -