我想将矩阵 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)
您至少有以下选择:
\n\n(v.*A')'(OP的建议)v'.*A(最短路线)mapslices(row->v.*row, A, 2)IE
\n\nfunction 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 \nRun Code Online (Sandbox Code Playgroud)\n\n速度对比(按升序排列)
\n\njulia> @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)\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:从@AborAmmar 的帖子(替换旧帖子)中进行了更仔细、更快的手动实施,并更新了速度比较。
\n