Матрица положительно определена?


19

Вступление

Сегодня мы позаботимся о несчастье первокурсников по линейной алгебре: определенность матрицы! По-видимому, это еще не проблема, поэтому здесь мы идем:

вход

  • A симметричная матрица в любом удобном формате (конечно, вы также можете взять только верхнюю или нижнюю часть матрицы)n×n AA
  • Опционально: размер матрицыn

Что делать?

Задача проста: если задана вещественная матрица Matrix, решите, является ли она положительно определенной, путем вывода истинного значения, если это так, и значения Falsey, если нет.n×n

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

Кто выигрывает?

Это , поэтому выигрывает самый короткий код в байтах (на язык)!


Что такое положительно-определенная матрица?

Существует, по-видимому, 6 эквивалентных формулировок, когда симметричная матрица положительно определена. Я воспроизведу три более простых и отсылаю вас к Википедии для более сложных.

  • Если то положительно определен. Это можно переформулировать следующим образом: если для каждого ненулевого вектора (стандартное) скалярное произведение числа и положительно, то положительно определено.vRn{0}:vTAv>0v v vA

    vvAvA
  • Пусть быть собственные из , если сейчас (то есть все собственные значения положительны) тогда положительно определен. Если вы не знаете, что такое собственные значения, я предлагаю вам использовать ваш любимый поисковик, чтобы выяснить это, потому что объяснение (и необходимые стратегии вычислений) слишком длинны, чтобы содержаться в этом посте.λii{1,,n}A i { 1 , , n } : λ i > 0 AAi{1,,n}:λi>0A
  • Если существует разложение Холецкого группы , т. Е. Существует нижнетреугольная матрица такая, что то положительно определен. Обратите внимание, что это эквивалентно раннему возвращению «false», если в любой момент вычисление корня во время алгоритма завершается неудачей из-за отрицательного аргумента.ALLLT=AA

Примеры

Для правдивого вывода

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Для вывода фальси

(по крайней мере одно собственное значение равно 0 / положительное полуопределено)

(322240202)

(собственные значения имеют разные знаки / неопределенные)

(100010001)

(все собственные значения меньше 0 / отрицательно определены)

(100010001)

(все собственные значения меньше 0 / отрицательно определены)

(230350001)

(все собственные значения меньше 0 / отрицательно определены)

(7.152.452.459.37)

(три положительных, одно отрицательное собственное значение / неопределенное)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



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

9
@ Shaggy Я думаю, что проблема лучше без всякого фона, чтобы засорить его. Есть много существующих объяснений того, что собственное значение находится в другом месте, и этот пост уже очень большой.
Пшеничный волшебник

1
Задача была бы лучше, если бы вы не ограничивали ввод симметричными матрицами.
Полфосол ఠ_ఠ

1
Я имел в виду, что просто проверять наличие собственных значений тоже скучно. Я знаю разные вкусы;)
polfosol ఠ_ఠ

Ответы:


11

C 108 байтов

-1 байт благодаря Logern
-3 байт благодаря floorcat

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

Попробуйте онлайн!

Выполняет исключение по Гауссу и проверяет, являются ли все диагональные элементы положительными (критерий Сильвестра). Аргумент n- это размер матрицы минус один.


Возможно, сохранить персонажа с помощью float вместо double?
Дженс


Вы можете сбрить другой символ, если пропустите i=0цикл for, сделаете рекурсивный вызов f(M,n-1,0)и начальный вызов с 0 в качестве третьего аргумента.
Дженс

@Jens 1. Использование чисел с плавающей запятой вместо двойных может быстро привести к заметным ошибкам округления, поэтому я не думаю, что один сохраненный байт того стоит. 2. Инициализация переменной с помощью дополнительного аргумента выглядит для меня обманом.
nwellnhof,

@Logern Я отказываюсь использовать трюк «опустить оператор возврата» в моих ответах на C. Но спасибо за другой сохраненный байт.
nwellnhof

9

MATLAB / Octave , 19 17 12 байт

@(A)eig(A)>0

Попробуйте онлайн!

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


Вы можете опустить f=в начале - анонимные функции обычно принимаются в качестве ответов.
Delfad0r

Спасибо за чаевые!
Даниэль Туризо,

Даже если это вектор? Интересно
Даниэль Туризо

1
+1. Я добавил ссылку, чтобы попробовать это онлайн. Надеюсь, ты не возражаешь. Обратите внимание, что это также доказывает, что выходные значения, несмотря на то, что они являются массивами, действительно считаются правильными значениями "истинного" или "ложного" согласно ссылке @ Delfad0r.
Том Карпентер

2
Сказав это, он терпит неудачу для первого "фальсифицированного" теста на TIO. Я предполагаю из-за проблемы точности - одно из значений Eigen получается как 0, 8.9219e-17а не 0.
Том Карпентер

7

Желе , 11 10 байт

ṖṖ€$ƬÆḊṂ>0

Использует критерий Сильвестра .

Попробуйте онлайн!

Как это устроено

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell , 56 байт

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

Попробуйте онлайн!

В основном порт Nwellnhof ответ . Выполняет исключение по Гауссу и проверяет, являются ли элементы на главной диагонали положительными.

Сбой первого вывода False из-за ошибок округления, но теоретически он будет работать с бесконечной точностью. Благодаря предложению Кертиса Бектела , теперь все результаты верны.


2
Вы можете добавить, inputs :: [[[Rational]]]чтобы получить правильные ответы
Кертис Бехтель

4

Должен ли 4-й контрольный пример быть ложным?
ч. В

@tsh Исправлено, я тупой!
г-н Xcoder

8
Забавно, что у Mathematica есть встроенная функция для этого , но ее название длиннее, чем ваше решение.
Федерико Полони

@FedericoPoloni: не будет ли решение, использующее NullSpace или MatrixRank, еще короче? Если нулевое пространство равно нулю, то матрица положительно определена.
Фил Х

@PhilH Нет, я боюсь, что это не работает само по себе. Например, второй пример Фэлси (диагональная матрица с (1, -1,1)) имеет ранг 3, но не является положительно определенным.
Федерико Полони,

3

MATL , 4 байта

Yv0>

Попробуйте онлайн!

[3 -2 2; -2 4 0; 2 0 2]01018


1
@ LuisMendo Спасибо, сегодня я узнал что-то новое о MATL!
г-н Xcoder

Мое удовольствие :-) Вот лучшее объяснение Suever. Я забыл сказать, что для комплексных массивов только действительная часть сравнивается с нулем. Так [1 2 3j]что Фальси
Луис Мендо



2

MATL , 6 байтов

Это можно сделать, используя еще меньше байтов, @Mr. Xcoder удалось найти 5-байтовый ответ MATL !

YvX<0>

объяснение

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

Попробуйте онлайн!


Сбой первого ложного теста. Смотрите мой удаленный ответ .
г-н Xcoder

1
@ Mr.Xcoder О, ты даже представил ответ до меня. Я думаю, что вы должны восстановить свой ответ, так как это зависит только от вопросов округления. (Я думаю, вы можете ожидать, что ответы будут использовать арифметику с ограниченной точностью - я думаю, что только языки CAS здесь используют точные вычисления.)
flawr

Следуя твоему совету, я его восстановил .
г-н Xcoder

1

Клен , 33 байта

(т.е. мои 2 цента)

with(LinearAlgebra):
IsDefinite(A)

Привет и добро пожаловать в PPCG; Я не знаком с Maple, хотя необходим ли перевод строки?
Джонатан Фрех

@JonathanFrech Привет и спасибо. Нет, это не так. Я не считал это между прочим.
Полфосол ఠ_ఠ

Мне кажется, что ваш текущий счетчик байтов отражает символ новой строки.
Джонатан Фрех

@JonathanFrech Дух мой, плохой
polfosol ఠ_ఠ

1
Ну ... теперь твой код и количество байтов не совпадают.
Джонатан Фрех

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.