Векторная норма массива векторов в MATLAB - PullRequest
19 голосов
/ 26 августа 2011

При вызове norm для матрицы в MATLAB вместо массива векторных норм возвращается так называемая «матричная норма» (скалярное значение). Есть ли способ получить норму каждого вектора в матрице без циклов и использования векторизации MATLAB?

Ответы [ 4 ]

26 голосов
/ 26 августа 2011

Вы можете самостоятельно вычислить норму каждого столбца или строки матрицы, используя поэлементные арифметические операторы и функции, определенные для работы с заданными размерами матрицы (например, SUM и MAX ). Вот как вы можете вычислить некоторые по столбцам нормы для матрицы M:

twoNorm = sqrt(sum(abs(M).^2,1)); %# The two-norm of each column
pNorm = sum(abs(M).^p,1).^(1/p);  %# The p-norm of each column (define p first)
infNorm = max(M,[],1);            %# The infinity norm (max value) of each column

Эти нормы можно легко заставить работать со строками вместо столбцов, изменив аргументы измерения с ...,1 на ...,2.

5 голосов
/ 11 ноября 2017

Начиная с версии 2017b, вы можете использовать vecnorm .

3 голосов
/ 05 ноября 2016

Существующая реализация для двухнормативной нормы может быть улучшена.

twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column

abs(M).^2 будет вычислять целую кучу ненужных квадратных корней, которые просто сразу возводятся в квадрат.

Гораздо лучше сделать:

twoNorm = sqrt( 
               sum( real(M .* conj(M)),  1 )
              )

Это эффективно обрабатывает реальные и сложные М.

Использование real() гарантирует, что sum и sqrt действуют на действительные числа (а не на комплексные числа с мнимым компонентом 0).

1 голос
/ 08 мая 2018

Небольшое добавление к ответу P i :

norm_2 = @(A,dim)sqrt( sum( real(A).*conj(A) , dim) )

допускает

B=magic([2,3])
norm_2( B , 1)
norm_2( B , 2)

или как это, если вы хотите файл norm_2.m:

function norm_2__ = norm_2 (A_,dim_)
    norm_2__ = sqrt( sum( real(A_).*conj(A_) , dim_) )  ;
end
...