从性能计算中排除矩阵元素

时间:2013-05-10 12:21:19

标签: performance matlab matrix

我想节省一些计算时间。我正在使用众所周知的Lucas Kanade算法进行一些图像处理。本文的出发点是Baker / Simon

我正在做这个Matlab,我也使用背景减法器。我希望减法器将所有背景设置为0或者具有逻辑掩码,其中1为前景,0为背景。

我想要的是排除所有作为计算背景的矩阵元素。我的目标是节省计算时间。我知道我可以使用像

这样的语法
A(A>0) = ... 

但这不像

那样有用
B(A>0) = A.*C.*D

因为我收到了错误:

在作业A(I)= B中,B和I中的元素数必须相同。

这可能是因为A,B和C都有比元素A更多的元素。

在c代码中,我只需循环矩阵并检查像素是否具有值0和继续。在这种情况下,保存一大堆计算。

然而,在matlab中循环矩阵的速度并不快。那么有一个快速的方法来解决我的问题吗?我在这里找不到足够的答案。

我认为任何人都感兴趣:我正在尝试使用强大的错误函数而不是二次函数。

更新

我尝试了以下方法来测试@Acorbe建议的速度:

function MatrixTest()
n = 100;
A = rand(n,n);
B = rand(n,n);
C = rand(n,n);
D = rand(n,n);

profile clear, profile on;
for i=1:10000    
    tests(A,B,C,D);  
end
profile off, profile report;

function result = tests(A,B,C,D)
    idx = (B>0);

    t = A(idx).*B(idx).*C(idx).*D(idx);
    LGS1a(idx) = t;   

    LGS1b = A.*B.*C.*D;

我用matlab的分析器获得了以下结果:

t = A(idx).*B(idx).*C(idx).*D(idx); 1.520 seconds 
LGS1a(idx) = t;   0.513 seconds
idx = (B>0);      0.264 seconds
LGS1b = A.*B.*C.*D; 0.155 seconds

正如您所看到的,通过索引访问矩阵的开销远远超过

1 个答案:

答案 0 :(得分:0)

以下情况如何?

 mask = A>0;

 B = zeros(size(A));    % # some initialization

 t = A.*C.*D;
 B( mask ) = t( mask );

通过这种方式,您只需选择t所需的元素。也许在计算中有一些开销,尽管对于for循环缓慢可能忽略不计。


修改

如果你想要更快的速度,你可以尝试一种更具选择性的方法,它在任何地方使用掩码。

 t = A(mask).*C(mask).*D(mask);
 B( mask ) = t;