MATLAB 中向量数组的向量范数

发布于 2024-12-01 18:39:23 字数 196 浏览 1 评论 0原文

在 MATLAB 中的矩阵上调用 norm 时,它返回所谓的“矩阵范数”(标量值),而不是向量范数数组。有没有办法在不循环的情况下获得矩阵中每个向量的范数并利用 MATLAB 的向量化?

When calling norm on a matrix in MATLAB, it returns what's known as a "matrix norm" (a scalar value), instead of an array of vector norms. Is there any way to obtain the norm of each vector in a matrix without looping and taking advantage of MATLAB's vectorization?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

溺ぐ爱和你が 2024-12-08 18:39:23

您可以使用 element-wise 自行计算矩阵每列或行的范数定义为对给定矩阵维度进行运算的算术运算符 和函数(例如 SUM< /a> 和 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

You can compute the norm of each column or row of a matrix yourself by using element-wise arithmetic operators and functions defined to operate over given matrix dimensions (like SUM and MAX). Here's how you could compute some column-wise norms for a matrix 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

These norms can easily be made to operate on the rows instead of the columns by changing the dimension arguments from ...,1 to ...,2.

口干舌燥 2024-12-08 18:39:23

从版本 2017b 开始,您可以使用 vecnorm

From version 2017b onwards, you can use vecnorm.

苏别ゝ 2024-12-08 18:39:23

现有的二范式实施可以得到改进。

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() 确保 sumsqrt 作用于实数(而不是虚部为 0 的复数)。

The existing implementation for the two-norm can be improved.

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

abs(M).^2 is going to be calculating a whole bunch of unnecessary square roots which just get squared straightaway.

Far better to do:

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

This efficiently handles real and complex M.

Using real() ensures that sum and sqrt act over real numbers (rather than complex numbers with 0 imaginary component).

找回味觉 2024-12-08 18:39:23

P i 的答案的稍微补充:

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

如果您想要一个norm_2.m文件,则允许

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

或如此:

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

Slight addition to P i's answer:

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

allows for

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

or as this if you want a norm_2.m file:

function norm_2__ = norm_2 (A_,dim_)
    norm_2__ = sqrt( sum( real(A_).*conj(A_) , dim_) )  ;
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文