julia常用矩阵函数_Julia中有效的元素矩阵运算

我需要执行(复杂)矩阵的离散卷积,并在Julia中定义以下函数:

function convolve(M::Array{Complex{Float64},2}, K::Array{Float64,2}, p::Int)

(n,m) = size(M)

res = zeros(Complex{Float64},n)

for k=1:p

for l=1:n

res[l] += M[l,k]*K[l,end-p+k]

end

end

return res

end

我这样使用它:

M=complex(rand(2000,2000))

K=rand(2000,2000)

@time convolve(M,K,2000,0)

现在这是相对快速和令人惊讶的,比矢量化版本更快(约3倍),其中我用res = M [:,k].* K [:,end-p k]替换内部循环. (我认为这是由于临时阵列的很多记忆分配,我可以忍受).

但是矢量化的MATLAB代码运行速度提高了大约5倍:

function res = convolve(M, K, p)

n = size(M,1);

res = zeros(n,1);

for k=1:p

res = res + M(:,k).*K(:,end-p+k);

end

end

我做错了什么?如何让Julia像MATLAB一样快速地执行元素乘法?这是一个索引问题吗?

注意:我已经使用@code_warntype检查过没有类型犹豫不决的搞笑业务(没有Any或Union等),但问题可能更微妙.宏@code_llvm产生了令人惊讶的长输出,但我不是专家所以我很难看到发生了什么.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值