朱莉娅将每个矩阵乘以暗淡

Kim*_*sen 6 matrix-multiplication julia

我有一个三维数组

x = rand(6,6,2^10)
Run Code Online (Sandbox Code Playgroud)

我希望沿着第三维将每个矩阵乘以一个向量.有没有更简洁的方法来做到这一点:

y = rand(6,1)
z = zeros(6,1,2^10)
for i in 1:2^10
    z[:,:,i] = x[:,:,i] * y
end
Run Code Online (Sandbox Code Playgroud)

DNF*_*DNF 8

如果您正在使用矩阵,可能应该考虑x作为矩阵的向量而不是3D数组.然后你可以做到

x = [rand(6,6) for _ in 1:2^10]
y = [rand(6)]
z = x .* y
Run Code Online (Sandbox Code Playgroud)

z 现在是矢量的矢量.

如果z预先分配,那就是

z .= x .* y
Run Code Online (Sandbox Code Playgroud)

并且,如果你想要它真的很快,使用矢量 StaticArrays

using StaticArrays

x = [@SMatrix rand(6, 6) for _ in 1:2^10]
y = [@SVector rand(6)]
z = x .* y
Run Code Online (Sandbox Code Playgroud)

这显示我的计算机上的速度提高了10倍,运行速度为12us.


Ale*_*ley 7

mapslices(i->i*y, x, (1,2)) 可能"更干净",但速度会慢一些.

读作:将"乘以y"函数应用于前两个维度的每个切片.

function tst(x,y)
   z = zeros(6,1,2^10)
   for i in 1:2^10
       z[:,:,i] = x[:,:,i] * y
   end
   return z
end

tst2(x,y) = mapslices(i->i*y, x, (1,2))
Run Code Online (Sandbox Code Playgroud)

time tst(x,y); 0.002152秒(4.10 k分配:624.266 KB)

@time tst2(x,y); 0.005720秒(13.36 k分配:466.969 KB)