Julia 中的向量矩阵元素明智乘法(按行)高效

RM-*_*RM- 5 julia

我想将矩阵 A 的每一行乘以相同的向量 v。例如

A =[1.0 3.0; 1.0 1.0]
v = [1.0, 2.0]
Run Code Online (Sandbox Code Playgroud)

我想输出

 [1.0 6.0; 1.0 2.0]
Run Code Online (Sandbox Code Playgroud)

到目前为止我正在做:

(v.*A')'
Run Code Online (Sandbox Code Playgroud)

但我怀疑这在计算上是否高效,因为我将矩阵转置两次。

请注意,这个问题已为 Matlab 解答(https://uk.mathworks.com/matlabcentral/answers/243307-vector-matrix-multiplication-row-wise

crs*_*nbr 5

您至少有以下选择:

\n\n
    \n
  • (v.*A')'(OP的建议)
  • \n
  • v'.*A最短路线
  • \n
  • mapslices(row->v.*row, A, 2)
  • \n
  • 来自 @AborAmmar 帖子的手动实施(最快的方法
  • \n
\n\n

IE

\n\n
function tt(v, A)\n    r = similar(A)\n    @inbounds for j = 1:size(A,2) \n        @simd for i = 1:size(A,1) \n            r[i,j] = v[j] * A[i,j] # fixed a typo here!\n        end\n    end \n    r\nend \n
Run Code Online (Sandbox Code Playgroud)\n\n

速度对比(按升序排列)

\n\n
julia> @btime tt($v,$A); # @AborAmmar's answer\n  38.826 ns (1 allocation: 112 bytes)\n\njulia> @btime ($v)'.*$A;               \n  49.920 ns (1 allocation: 112 bytes)\n\njulia> @btime (($v).*($A)')';           \n  123.797 ns (3 allocations: 336 bytes)                           \n\njulia> @btime mapslices(row->($v).*row, $A, 2);\n  25.174 \xce\xbcs (106 allocations: 5.16 KiB)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:从@AborAmmar 的帖子(替换旧帖子)中进行了更仔细、更快的手动实施,并更新了速度比较。

\n