gpt4 book ai didi

matlab - 更快的投影范数(二次形式、度量矩阵...)式计算

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:17 24 4
gpt4 key购买 nike

我需要对表单进行大量评估

X(:,i)' * A * X(:,i)   i = 1...n

其中 X(:,i) 是向量,A 是对称矩阵。表面上,我可以循环执行此操作

for i=1:n
z(i) = X(:,i)' * A * X(:,i)
end

这很慢,或者将其矢量化为

z = diag(X' * A * X)

当 X 有很多列时,这会 Not Acceptable 地浪费 RAM。目前我正在妥协

Y = A * X
for i=1:n
z(i) = Y(:,i)' * X(:,i)
end

速度更快/更轻一些,但似乎仍不能令人满意。

我希望可能有一些 matlab/scilab 惯用语或技巧可以更有效地实现这个结果?

最佳答案

在 MATLAB 中试试这个:

z = sum(X.*(A*X));

这给出的结果相当于 Federico's suggestion使用函数 DOT ,但应该运行得稍微快一些。这是因为 DOT函数内部计算结果的方式与我上面使用 SUM 所做的相同功能。然而,DOT对于处理复数的情况,还有额外的输入参数检查和额外计算,这是您可能不想要或不需要的额外开销。

关于计算效率的注释:

尽管这两种方法的运行速度之间的时间差异很小,但如果您要执行该操作很多 次,它就会开始加起来。为了测试相对速度,我创建了两个 100×100 的随机值矩阵,并在多次运行中对这两种方法进行计时以获得平均执行时间:

    METHOD        AVERAGE EXECUTION TIME
--------------------------------------------
Z = sum(X.*Y); 0.0002595 sec
Z = dot(X,Y); 0.0003627 sec

使用 SUM而不是 DOT因此,对于具有大约 10,000 个元素的矩阵,此操作的执行时间减少了大约 28%。矩阵越大,两种方法之间的这种差异就越可以忽略不计。

总而言之,如果此计算代表您的代码运行速度的重大瓶颈,我会使用 SUM 的解决方案。 .否则,任何一种解决方案都应该没问题。

关于matlab - 更快的投影范数(二次形式、度量矩阵...)式计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com