【问题标题】:Matlab computation of L2 norm is very slowL2范数的Matlab计算非常慢
【发布时间】:2021-12-31 17:54:54
【问题描述】:

我有以下 MATLAB sn-p:

>> 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)

这根本没有意义。任何帮助表示赞赏!

【问题讨论】:

  • 请注意,在 Julia 中,最好使用 BenchmarkTools.jl 中的 @btime 进行计时,以确保不会意外捕获编译时间。

标签: performance matlab matrix julia linear-algebra


【解决方案1】:

我邀请您阅读documentation for 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(自 R2017b 起)。要计算向量化矩阵的范数,请使用norm(R(:))


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

【讨论】:

  • 使用BenchmarkTools 就像@ColinTBowers 指出的那样,时间是:1-norm=17ms,2-norm=23ms,inf-norm=29ms。所以它并不像问题中的时间那么慢。至于为什么不快,看起来 1-norm 和 2-norm 调用了专门的 BLAS 方法,而 inf-norm 只有一个通用的 Julia 实现。
  • 有趣的是,Infinity 范数比明显的 maximum(abs, R) 慢 2.3 倍。
  • github.com/JuliaLang/julia/pull/43190 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多