Есть ли функция для проверки, является ли матрица доминирующей по диагонали (доминирование строки)
Матрица доминирует по диагонали (по строкам), если ее значение на диагонали в абсолютном смысле больше, чем сумма всех других абсолютных значений в этой строке. То же самое касается столбцов, только наоборот.
Есть ли в Matlab функция для проверки этого? (Я мог бы написать простой цикл, но я пытаюсь выйти из них).
2 ответа
Почему петля?
Вы можете легко сформировать сумму абсолютных значений в данной строке.
sum(abs(A),2)
Можете ли вы сравнить это с абсолютными диагональными элементами в каждой строке?
abs(diag(A)) >= sum(abs(A),2)
Конечно, это не правильно, так как диагональные члены не должны быть включены в первую сумму. Несмотря на это, мы можем легко устранить проблему.
(2*abs(diag(A))) >= sum(abs(A),2)
Наконец, нам нужен результат этого теста. Выше тестирует каждый ряд. Матрица доминирует по диагонали, если этот тест верен для ВСЕХ строк.
all((2*abs(diag(A))) >= sum(abs(A),2))
Там нет функции, о которой я знаю. Тем не менее, вы можете сделать простой тест без циклов.
%# create an array
array = magic(3);
%# take the absolute of the array
absArray = abs(array);
%# To be diagonally dominant, the row and column sums have to be less
%# than twice the diagonal
rowSum = sum(absArray,1)';%#' (formatting comment)
colSum = sum(absArray,2);
dia = diag(absArray);
%# test
isDiagonallyDominantByRow = all(rowSum <= 2 * dia);
isDiagonallyDominantByCol = all(colSum <= 2 * dia);
isTotallyDominant = isDiagonallyDominantByRow && isDiagonallyDominantByCol;