因此,我尝试使用此代码检查图像的一行上的所有像素是否低于某个阈值。然而,问题是这个代码是在一个双循环中执行的(是的,我知道:(),每个像素一次,所以它非常慢。我想知道我还能做什么。
一些提示会很棒,因为我对MATLAB优化很陌生,而且我只知道基础知识(尽量不要使用循环,或者在内部函数中多次调用脚本等)。如果这不起作用,我可能不得不求助于MEX文件,而且对于我小组中的其他研究人员来说,这将更难维护。谢谢!
for y = 1:y_len
for x = 1:x_len
%//...do stuff to calc slope and offset for the line,
%//this can be vectorized pretty easily.
yIndices = xIndices.*slope + offset;
yIndices = round(yIndices);
yIndices = yIndices + 1;
xIndices = xIndices + 1;
valid_points = (yIndices <= 308) & (yIndices > 0);
%this line is bottle necking----------------------------------------
valid_points = yIndices(valid_points)+(xIndices(valid_points)-1)*308;
%-------------------------------------------------------------------
valid_points = valid_points(phaseMask_R(valid_points));
t_vals = abs(phase_R(valid_points)-currentPhase);
point_vals = [XsR(valid_points);YsR(valid_points)] - 1;
matchedPtsCoordsR = point_vals(:,(t_vals<phaseThreshold) |(abs(192-t_vals)<phaseThreshold));
matchedIndex = size(matchedPtsCoordsR,2);
if(matchedIndex ==0)
continue
end
centersMinMaxR = zeros(1,matchedIndex);
cmmIndexR = 1;
for a = 1:matchedIndex;
if(a==1)
avgPosition = matchedPtsCoordsR(:,a);
centersMinMaxR(1,1) =1;
else
currentPosition = matchedPtsCoordsR(:,a);
%also very slow----------------------------------------------
distance = sum(abs(currentPosition-avgPosition));
%------------------------------------------------------------
if(distance>4) % We are now likely in a different segment.
centersMinMaxR(2,cmmIndexR) = a-1;
cmmIndexR = cmmIndexR + 1;
centersMinMaxR(1,cmmIndexR) = a;
end
avgPosition = matchedPtsCoordsR(:,a);
end
end
centersMinMaxR(2,cmmIndexR) = a;
centersR = round(sum(centersMinMaxR)/2);
%//...do stuff with centersR
%//I end up concatenating all the centersR into a
%//large vector arrray with the start and end of
%//each segment.
答案 0 :(得分:1)
首先,MatLab Profiler是你最好的朋友,我假设你知道它,因为你知道什么线是瓶颈。
删除双循环的快速解决方法是使用:
命令。您可以使用单个循环,而不是使用双循环,但可以为每个行或列索引计算整个维度。举个简单的例子:
m = magic(2);
slope = 5;
m =
1 3
4 2
m(1,:) * slope =
5 15
m(:,1) * slope =
5
20
不使用锯齿状数组,而是使用稀疏数组。 Matlab内置了对它们的支持:
Matlab Sparse Matrix Operations
<强>更新强>
关于使用稀疏与普通数组的利弊: Sparse vs Normal Array Matlab
稀疏矩阵是真正的福音 使用真正稀疏的人 矩阵,但25%的非零是简单的 没有“稀疏”足以获得任何收益 大多数情况。
请查看更多更新,因为我有更多时间来审核您的代码:p