Подтвердить что ты не робот

Векторная норма массива векторов в MATLAB

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

4b9b3361

Ответ 1

Вы можете самостоятельно вычислить норму каждого столбца или строки матрицы, используя элементарные арифметические операторы и функции, определенные для работы по заданным размеры матрицы (например, 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.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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