2010-04-02 61 views
4

我需要执行大量的形式的评价更快投影范数(二次形式,度量矩阵...)式计算

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

其中X(:,i)是向量和A是一个对称矩阵。从表面上看,我可以做到这一点在一个循环

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

这是缓慢的,或者vectorise它作为

z = diag(X' * A * X) 

这浪费RAM不可接受的当X有很多列。目前我在妥协

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

这是一个更快/更轻,但仍然似乎不满意。

我希望有一些matlab/scilab成语或技巧来更有效地实现这个结果?

回答

3

试试这个在MATLAB:

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

使用此功能DOT给出的结果等同于Federico's suggestion,而应稍快运行。这是因为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来解决这个问题。否则,任何一种解决方案都应该没问题

3

试试这个:

z = dot(X, A*X) 

我没有Matlab的这里测试,但它适用于八度,所以我希望Matlab的有类似的dot()功能。

从倍频的帮助:

-- Function File: dot (X, Y, DIM) 
    Computes the dot product of two vectors. If X and Y are matrices, 
    calculate the dot-product along the first non-singleton dimension. 
    If the optional argument DIM is given, calculate the dot-product 
    along this dimension. 
1

为了完整起见,gnovice在Scilab的答案会是

z = sum(X .* Y, 1)'