首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将矩阵元素排除在性能计算之外

将矩阵元素排除在性能计算之外
EN

Stack Overflow用户
提问于 2013-05-10 12:21:19
回答 1查看 324关注 0票数 0

我正在努力节省一些计算时间。我正在用著名的Lucas Kanade算法做一些图像处理。起点是贝克/西蒙的这篇论文。

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

我想要的是从计算中排除所有背景的矩阵元素。我的目标是节省计算时间。我知道我可以使用如下的语法

代码语言:javascript
复制
A(A>0) = ... 

但这在某种程度上行不通

代码语言:javascript
复制
B(A>0) = A.*C.*D

因为我收到了一个错误:

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

这可能是因为A、B和C三种元素加在一起比矩阵A有更多的元素。

在c代码中,我只需循环矩阵并检查像素值是否为0和继续。在这种情况下,节省了大量的计算。

然而,在matlab中,遍历矩阵的速度并不快。那么,有没有快速解决我的问题的方法呢?我对这里的问题找不到足够的解决办法。

我假设任何人都感兴趣:我试图使用稳健的错误函数,而不是二次错误函数。

更新:

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

代码语言:javascript
复制
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的轮廓仪得到了后续的结果:

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-10 12:24:54

下面的呢?

代码语言:javascript
复制
 mask = A>0;

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

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

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

编辑:

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

代码语言:javascript
复制
 t = A(mask).*C(mask).*D(mask);
 B( mask ) = t;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16482154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档