Matlab计算L2范数非常慢

gou*_*aha 4 performance matlab matrix linear-algebra julia

我有以下 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.
>> 
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么 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)
Run Code Online (Sandbox Code Playgroud)

这完全没有意义。任何帮助表示赞赏!

Cri*_*ngo 11

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

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

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

相比之下,矩阵的 2-范数需要奇异值分解,这要昂贵得多。

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

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


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

  • 使用 @ColinTBowers 指出的“BenchmarkTools”,时间为:1-norm=17ms、2-norm=23ms、inf-norm=29ms。所以它并不像问题中的时间那么慢。至于为什么它不更快,看起来 1-norm 和 2-norm 调用专门的 BLAS 方法,而 inf-norm 只有通用的 Julia 实现。 (4认同)
  • 有趣的是,无穷范数比明显的“最大值(abs,R)”慢 2.3 倍。 (2认同)
  • https://github.com/JuliaLang/julia/pull/43190 修复了这个问题。 (2认同)