julia - 在 Julia 1.0 中提高 for 循环速度
问题描述
我有一个长向量 V 和一个大矩阵 M。我的目的是在下面的 Julia 代码中。
using LinearAlgebra
function myfunction(M,V)
n = size(V,1)
sum = 0
summ = 0
for i = 1:n-1
for j = i+1:n
a= [i,j]
Y = V[a]
X = M[a,a]
sum += Y'*inv(X)*Y
summ += tr(X)*Y'*Y
end
end
return sum, summ
end
M = randn(10000,10000)
V = randn(10000)
@time myfunction(M,V)
由于向量很长,矩阵也很大,所以这个过程需要很长时间。我在这个问题上花了很长时间。我真的很感谢你的帮助!
解决方案
我只是手动展开计算以避免分配:
function myfunction2(M::AbstractMatrix{T},V::AbstractVector{T}) where {T}
n = size(V, 1)
sum = zero(T)
summ = zero(T)
for i = 2:n
for j = 1:i-1
@inbounds y1, y2 = V[i], V[j]
y11 = y1*y1
y12 = y1*y2
y22 = y2*y2
@inbounds a, b, c, d = M[i,i], M[i,j], M[j,i], M[j,j]
sum += (d*y11-(c+b)*y12+a*y22) / (a*d-b*c)
summ += (a+d)*(y11+y22)
end
end
return sum, summ
end
M
(请注意,我对和做出了明确的假设V
)
编辑这是最低限度的快
function myfunction3(M::AbstractMatrix{T},V::AbstractVector{T}) where {T}
n = size(V, 1)
sum = zero(T)
summ = zero(T)
for i = 2:n
@inbounds y1 = V[i]
@inbounds a = M[i,i]
y11 = y1*y1
for j = 1:i-1
@inbounds y2 = V[j]
y12 = y1*y2
y22 = y2*y2
@inbounds b, c, d = M[i,j], M[j,i], M[j,j]
sum += (d*y11-(c+b)*y12+a*y22) / (a*d-b*c)
summ += (a+d)*(y11+y22)
end
end
return sum, summ
end
推荐阅读
- javascript - Vuetify Autocmplete 动态加载数据
- android - APK 写入的推荐位置
- node.js - TypeError: roomsRepo.addOneRoom 不是函数
- hbase - HBase bulkload 生成方式太多的 storefile
- c - 在 C 中找到方程的根时输出错误
- blockchain - ERC 1155 代币标准
- php - 将wordpress php短代码挂钩放在if语句中是否正确,其中if语句是post方法的响应?
- python - Pandas 过滤值低于 10 且大于 1000 的数据帧行
- mongodb - mongod 不读取 mongod.conf 设置
- flutter - 在 asyncMap 未来解决后 StreamBuilder 不刷新