为何Matlab中矩阵L2范数计算远慢于L1/无穷范数但Julia表现相反
核心差异来自两个语言norm函数对矩阵参数的默认定义不同
1. MATLAB 中norm函数对矩阵输入的默认行为
MATLAB 中当输入为矩阵时,norm(R, p)默认计算算子范数(诱导范数),不同p值对应的计算逻辑和复杂度差异极大:
norm(R, 1):取所有列的绝对值和的最大值,仅需遍历一次矩阵逐列求和再取最大值,时间复杂度为O(mn)(m、n为矩阵行列数),属于线性复杂度,速度极快norm(R, inf):取所有行的绝对值和的最大值,同样是O(mn)线性复杂度,所以和L1范数耗时接近norm(R, 2):求解矩阵的最大奇异值,需要执行奇异值分解(SVD)或者幂法迭代,时间复杂度为O(min(m,n)² * max(m,n)),你测试用的3000×6000矩阵,该复杂度比前两者高了3个数量级,所以耗时差上千倍是符合预期的
如果需要在MATLAB中计算元素级L2范数(把矩阵展平为一维向量,计算所有元素平方和开根号),写法为norm(R(:), 2),该操作同样是线性复杂度,速度会和L1、无穷范数接近
2. Julia 中norm函数对矩阵输入的默认行为
Julia 标准库LinearAlgebra中,元素级范数和算子范数是两个完全独立的接口:
norm(R, p)默认把矩阵视为一维向量,计算元素级p范数,无论p取1、2还是无穷,时间复杂度都是O(mn)- 如果要计算和MATLAB逻辑一致的算子范数,需要调用
opnorm(R, p)接口
你在Julia中测试的norm(R, 2)是元素级L2范数,仅需遍历所有元素计算平方和再开根号,自然和L1范数速度接近;你可以尝试调用opnorm(R, 2),耗时会和MATLAB的norm(R, 2)处于同一量级。
你测试中Julia的norm(R, Inf)耗时偏高,大概率是测试时的CPU缓存波动、内存访问模式差异,或者没有排除第一次调用的编译开销,重复多次测试取平均后,速度应该和其余元素级范数接近。
内容的提问来源于stack exchange,提问作者gouhaha
相关产品推荐
相关产品推荐

