Performance Matlab:如何在二维向量集上对嵌套循环进行向量化
我有一个如下形式的函数:Performance Matlab:如何在二维向量集上对嵌套循环进行向量化,performance,matlab,image-processing,vectorization,Performance,Matlab,Image Processing,Vectorization,我有一个如下形式的函数: function Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix) ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means); if ellipsoid <= 1 Out = 1; else Out = 0;
function Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix)
ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means);
if ellipsoid <= 1
Out = 1;
else
Out = 0;
end
end
是椭球体的方程。我的问题是每次你都可以将一个像素(它是一个7*1的向量,其中每行是一个单独频带中像素的值)传递给这个函数,所以我需要写一个这样的循环:
for k1=1:2048
for k2=1:2048
pixel(:,1)=image(k1,k2,:);
Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix);
end
end
你知道这将花费系统大量的时间和精力。你能给我建议一种降低系统压力的方法吗 不需要循环
pMinusMean = bsxfun( @minus, reshape( image, [], 7 ), means' ); %//' subtract means from all pixes
iCv = inv( arianceCovarianceMatrix );
ell = sum( (pMinusMean * iCv ) .* pminusMean, 2 ); % note the .* the second time!
Out = reshape( ell <= 1, size(image(:,:,1)) ); % out is 2048-by-2048 logical image
pMinusMean=bsxfun(@减号,重塑(图像,[],7),表示“);%/”从所有像素中减去平均值
iCv=inv(变异协方差矩阵);
ell=总和((pMinusMean*iCv)。*pMinusMean,2);%第二次注意。*!
Out=重塑(呃…你刚才是不是用inv()
来解线性系统?在doc inv
的顶部附近:“在实践中,很少需要形成矩阵的显式逆。在求解线性方程组时,inv
经常被误用。解决这个问题的一种方法是使用x=inv(a)*b
。从执行时间和数值精度的角度来看,更好的方法是使用矩阵除法运算符x=A\b
。这将使用高斯消去法生成解,而不形成逆解。有关更多信息,请参阅mldivide
(```)。“@RodyOldenhuisinv
在这个问题中不用于求解方程组,它被用作高斯(椭球体)的协方差矩阵。嗯……那么?是什么阻止你写和(pMinusMean/varianceovisicancematrix.*pMinusMean,2)
?@Shai:这不是我的本意,但谢谢:)这并不是因为它“执行得很差”,而是因为没有一种算法能像你用来计算产品的inv(A)*x
或x*inv(A)
那样快速准确。很抱歉,如果我在这个问题上有点强硬,但是当你看到人们使用I
或j
作为变量名时,你会怎么做?:)我的意思是,出于教育原因,实现气泡排序或bogosort一次或两次是很好的,但实际上,最终你应该使用和教授的是快速排序(和类似的)——与inv()
相同。你的评论不是关于a*X=B
,而是永远不要使用inv
。我不喜欢笼统的陈述。正如您所说,教新用户为什么事情会以这样或那样的方式运行,以及如何权衡,总比只说“从不”要好。正如前面提到的,inv
是一个简单的函数,在某些情况下具有速度优势。只要理解某个特定问题的数字,就不一定需要精确到eps。“最好”并不总是意味着最准确<代码>跟踪(A\eye(size(A))
比我的机器上的大型随机矩阵的跟踪(inv(A))
花费的时间长50%。
pMinusMean = bsxfun( @minus, reshape( image, [], 7 ), means' ); %//' subtract means from all pixes
iCv = inv( arianceCovarianceMatrix );
ell = sum( (pMinusMean * iCv ) .* pminusMean, 2 ); % note the .* the second time!
Out = reshape( ell <= 1, size(image(:,:,1)) ); % out is 2048-by-2048 logical image
pMinusMean = bsxfun( @minus, reshape( image, [], 7 ), means' ); %//' subtract means from all pixes
ell = sum( (pMinusMean / varianceCovarianceMatrix ) .* pminusMean, 2 ); % note the .* the second time!
Out = reshape( ell <= 1, size(image(:,:,1)) );