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)
如果您正在使用矩阵,可能应该考虑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.
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)