L2 范数的 Matlab 计算非常慢

Matlab computation of L2 norm is very slow

我有以下 MATLAB 片段:

>> R = randn(3000,6000);   % build a random 3000 by 6000 matrix
>> tic; norm(R, 1); toc;
Elapsed time is 0.005586 seconds.
>> tic; norm(R, 2); toc;
Elapsed time is 3.019667 seconds.
>> tic; norm(R, inf); toc;
Elapsed time is 0.005393 seconds.
>> 

我的问题是,为什么 L2 范数计算比 L1 或 L 无穷大范数慢那么多?当然,这是一个用于测试目的的随机矩阵,但对于我工作中的实际矩阵,我可以在经过的时间方面看到类似的模式。

但是在Julia上,结果如下

julia> @time norm(R, 1);
  0.007156 seconds (1 allocation: 16 bytes)

julia> @time norm(R, 2);
  0.009142 seconds (1 allocation: 16 bytes)

julia> @time norm(R, Inf);
  0.034633 seconds (1 allocation: 16 bytes)

这完全没有意义。感谢您的帮助!

我邀请您阅读documentation for norm。始终阅读函数的文档而不是对其功能做出假设是个好主意。简而言之,对于矩阵输入,norm 计算矩阵范数:

  1. norm(R,1)R.
  2. 的最大绝对列总和
  3. norm(R,Inf)R.
  4. 的最大绝对行总和
  5. norm(R,2) 大约是 max(svd(R)).

矩阵的 1 范数和无穷范数以类似的方式计算,因此预计成本相似。计算行或列的总和以及结果的最大值非常便宜。

相比之下,矩阵的 2 范数需要奇异值分解,这明显更昂贵。

在 Julia 中,norm 计算向量范数。要计算矩阵范数,请使用 opnorm.

要在 MATLAB 中计算矩阵的行或列的向量范数,请使用 vecnorm(自 R2017b 起)。要计算向量化矩阵的范数,请使用 norm(R(:)).


PS:真正的问题是为什么 Julia 中的无穷范数这么慢?应该比1范数便宜,比2范数便宜很多!