Есть ли функция для проверки, является ли матрица доминирующей по диагонали (доминирование строки)

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

Есть ли в 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;
Другие вопросы по тегам