Optimization 这段matlab脚本可以进一步矢量化吗?
所以我试图用这段代码找到一行图像上低于某个阈值的所有像素。然而,问题是,这段代码是在双for循环中执行的(是的,我知道:()),每像素执行一次,所以速度非常慢。我想知道我还能做些什么 有些技巧会很好,因为我对MATLAB优化非常陌生,而且我只知道基础知识(尽量不要在内部函数中多次使用循环或调用脚本等)。如果这不起作用,我可能不得不求助于MEX文件,这对我小组中的其他研究人员来说将更难维护。谢谢Optimization 这段matlab脚本可以进一步矢量化吗?,optimization,matlab,vectorization,Optimization,Matlab,Vectorization,所以我试图用这段代码找到一行图像上低于某个阈值的所有像素。然而,问题是,这段代码是在双for循环中执行的(是的,我知道:()),每像素执行一次,所以速度非常慢。我想知道我还能做些什么 有些技巧会很好,因为我对MATLAB优化非常陌生,而且我只知道基础知识(尽量不要在内部函数中多次使用循环或调用脚本等)。如果这不起作用,我可能不得不求助于MEX文件,这对我小组中的其他研究人员来说将更难维护。谢谢 for y = 1:y_len for x = 1:x_len %//...d
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.
y=1时的:y
对于x=1:x_len
%//…计算直线的坡度和偏移量,
%//这可以很容易地矢量化。
yIndices=xIndices.*斜率+偏移量;
阴骰=圆形(阴骰);
阴骰=阴骰+1;
xIndices=xIndices+1;
有效_点=(阴骰子0);
%这条线太瓶颈了----------------------------------------
有效点数=阴骰(有效点数)+(新骰(有效点数)-1)*308;
%-------------------------------------------------------------------
有效_点=有效_点(相位符号(有效_点));
t\u VAL=abs(相位(有效点)-当前相位);
分值=[XsR(有效分值);YsR(有效分值)]-1;
matchedPtsCoordsR=point_vals(:,(t_vals首先,MatLab Profiler是您最好的朋友,我认为您了解它,因为您知道什么是瓶颈
删除双循环的一个快速修复方法是使用:
命令。您可以使用单个循环而不是使用双循环,但可以为每一行或列索引沿整个维度进行计算。举个简单的示例:
m = magic(2);
slope = 5;
m =
1 3
4 2
m(1,:) * slope =
5 15
m(:,1) * slope =
5
20
不要使用锯齿状阵列,而是使用稀疏阵列。Matlab内置了对它们的支持:
更新
关于使用稀疏阵列与普通阵列的优点:
稀疏矩阵是一个真正的福音
使用真正稀疏的
矩阵,但25%的非零
没有足够的“稀疏”来获得任何
大多数情况下
寻找更多更新,因为我有更多的时间来查看您的代码:首先,MatLab Profiler是您最好的朋友,我假设您了解它,因为您知道什么是瓶颈
删除双循环的一个快速修复方法是使用:
命令。您可以使用单个循环而不是使用双循环,但可以为每一行或列索引沿整个维度进行计算。举个简单的示例:
m = magic(2);
slope = 5;
m =
1 3
4 2
m(1,:) * slope =
5 15
m(:,1) * slope =
5
20
不要使用锯齿状阵列,而是使用稀疏阵列。Matlab内置了对它们的支持:
更新
关于使用稀疏阵列与普通阵列的优点:
稀疏矩阵是一个真正的福音
使用真正稀疏的
矩阵,但25%的非零
没有足够的“稀疏”来获得任何
大多数情况下
由于我有更多的时间来查看您的代码,请期待更多的更新:p谢谢您的回复!我在矢量化过程中遇到的一些问题主要在于,我不确定每个像素有多少个点,而且锯齿阵列也不是真的supported@Xzhsh,而不是锯齿阵列创建稀疏阵列稀疏阵列如果我还有很多计算要做,那么稀疏阵列在哪一点上比普通阵列好,并且大约25%的阵列是非零的?谢谢你的回答!我在矢量化它时遇到的一些问题主要在于我不确定每个像素有多少个点,而锯齿阵列是非零的“不是真的supported@Xzhsh,而不是锯齿阵列创建稀疏阵列。Matlab内置了对稀疏阵列的支持,如果我还有很多计算要做,并且大约25%的阵列是非零的,那么在哪一点上稀疏阵列比普通阵列更好?