Memory management 更新向量以避免过多的内存使用

Memory management 更新向量以避免过多的内存使用,memory-management,julia,Memory Management,Julia,我有一个返回向量的函数。因为我多次调用这个函数,所以我希望它更新我提供给它的向量,而不是创建一个新的向量。这是为了避免使用内存,从而提高速度 原始代码基本上如下所示: function!(prob1,pi,prob0) prob1=pi'*prob0 return prob1 end 当然,每次都会创建一个新的prob1向量。我试图用两种不同的方式来修正这一点: function!(prob1,pi,prob0) for i in 1:length(prob1)

我有一个返回向量的函数。因为我多次调用这个函数,所以我希望它更新我提供给它的向量,而不是创建一个新的向量。这是为了避免使用内存,从而提高速度

原始代码基本上如下所示:

function!(prob1,pi,prob0)
prob1=pi'*prob0
return prob1
end
当然,每次都会创建一个新的prob1向量。我试图用两种不同的方式来修正这一点:

    function!(prob1,pi,prob0)
    for i in 1:length(prob1)    
    prob1[i]=pi[:,i]'*prob0
    end
    return prob1
    end

#OR

    function!(prob1,pi,prob0)
    for i in 1:length(prob1)    
    prob1[i]=dot(pi[:,i],prob0)
    end
    return prob1
    end

然而,两者都比原始代码运行得慢,尽管它们使用的内存更少。任何关于提高性能时间的建议都非常好。

实际上,您不需要定义函数,已经有一个函数(尽管没有文档记录):
At_mul_B!(prob1,pi,prob0)
应该给你想要的。

pi和prob0是列向量吗?或者prob0是一个矩阵吗?pi是一个平方矩阵,prob0是一个列向量,使得prob1也是一个列向量。为了举例说明,假设pi是m*m,prob0是m*1(因此prob1也是m*1),您可以尝试对pi[:.i]进行去因子化。。。这意味着要做一个嵌套循环。。。我不确定这是不是你需要的。。。但是我认为它对你有用。这里一定有一些输入错误,因为
matrix[:.I]
是无效的语法。哦,你说得对,蒂姆,出于某种原因,我认为点是逗号。嗨,西蒙,我的函数不仅仅是向量/矩阵的乘法。例如,prob1=pi'*prob0之后实际上有大量的代码。但是,我希望在此步骤中避免创建新的向量。您打算如何使用At_mul_B?他明确地输入了如何使用它,所以我不确定我是否理解你的问题。如果您有其他计算,您可以在以后的代码中访问
prob1
pi
prob0
的元素。是的,我很抱歉-我误解了Simon的回答。我现在已经试过西蒙的建议了。它确实显著减少了内存使用(大约三分之一),但我仍然没有得到速度的显著降低。然而,绝对值得知道,所以谢谢你的建议!