我试图节省一些计算时间。我正在使用众所周知的 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
如您所见,按索引访问矩阵的开销远不止仅