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
(```)。“@RodyOldenhuis
inv
在这个问题中不用于求解方程组,它被用作高斯(椭球体)的协方差矩阵。嗯……那么?是什么阻止你写
和(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)) );