poster
2019-12-10, 20:30
我需要对表格进行很多评估
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的列很多时,这会浪费RAM。目前我正在妥协
Y = A * X for i=1:n z(i) = Y(:,i)' * X(:,i) end 速度更快/更轻一点,但仍然不能令人满意。
我希望可能有一些matlab / scilab习语或技巧可以更有效地实现此结果?
回答:
在MATLAB中尝试以下操作:
z = sum(X.*(A*X)); 这样得出的结果与使用功能DOT的 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html) Federico的建议 (https://stackoverflow.com/questions/2568939/faster-projected-norm-quadratic-form-metric-matrix-style-computations/2568985#2568985)相同,但运行速度应稍快一些。这是因为DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)函数在内部计算结果的方式与我上面使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)函数所做的方式相同。但是,在处理复杂数字的情况下, DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)还具有其他输入参数检查和额外的计算功能,这可能是您不希望或不需要的额外开销。
关于计算效率的说明:
即使时间差之间的两种方法如何跑得快小,如果你将要执行的操作很多次,它会开始增加。为了测试相对速度,我创建了两个100×100的随机值矩阵,并对这两种方法进行多次计时,以得出平均执行时间:
METHOD AVERAGE EXECUTION TIME -------------------------------------------- Z = sum(X.*Y); 0.0002595 sec Z = dot(X,Y); 0.0003627 sec 因此,对于具有大约10,000个元素的矩阵,使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)代替DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)可以使该操作的执行时间减少约28%。矩阵越大,两种方法之间的差异就越小。
总而言之,如果此计算代表了代码运行速度的重大瓶颈 ,那么我将使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)解决方案。否则,任何一种解决方案都应该可以。
更多&回答... (https://stackoverflow.com/questions/2568939)
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的列很多时,这会浪费RAM。目前我正在妥协
Y = A * X for i=1:n z(i) = Y(:,i)' * X(:,i) end 速度更快/更轻一点,但仍然不能令人满意。
我希望可能有一些matlab / scilab习语或技巧可以更有效地实现此结果?
回答:
在MATLAB中尝试以下操作:
z = sum(X.*(A*X)); 这样得出的结果与使用功能DOT的 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html) Federico的建议 (https://stackoverflow.com/questions/2568939/faster-projected-norm-quadratic-form-metric-matrix-style-computations/2568985#2568985)相同,但运行速度应稍快一些。这是因为DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)函数在内部计算结果的方式与我上面使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)函数所做的方式相同。但是,在处理复杂数字的情况下, DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)还具有其他输入参数检查和额外的计算功能,这可能是您不希望或不需要的额外开销。
关于计算效率的说明:
即使时间差之间的两种方法如何跑得快小,如果你将要执行的操作很多次,它会开始增加。为了测试相对速度,我创建了两个100×100的随机值矩阵,并对这两种方法进行多次计时,以得出平均执行时间:
METHOD AVERAGE EXECUTION TIME -------------------------------------------- Z = sum(X.*Y); 0.0002595 sec Z = dot(X,Y); 0.0003627 sec 因此,对于具有大约10,000个元素的矩阵,使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)代替DOT (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dot.html)可以使该操作的执行时间减少约28%。矩阵越大,两种方法之间的差异就越小。
总而言之,如果此计算代表了代码运行速度的重大瓶颈 ,那么我将使用SUM (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sum.html)解决方案。否则,任何一种解决方案都应该可以。
更多&回答... (https://stackoverflow.com/questions/2568939)