2

我有以下形式的功能:

function Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix)  
   ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means);  
   if ellipsoid <= 1
      Out = 1;
   else
      Out = 0;
   end
end  

我正在用 matlab 进行遥感处理,我想对 LandSatTM 图像进行分类。这张图片有 7 个波段,大小为 2048*2048。所以我将它们存储在 3 维 2048*2048*7 矩阵中。在此函数中表示为 7 *1 之前使用名为 ExtractStatisticalParameters 和 VarianceCovarianceMatrix 的函数中的类样本计算的矩阵是一个 7*7 矩阵,实际上您会看到:

ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means);  

是椭圆体的方程。我的问题是每次你可以将一个像素(它是一个 7*1 向量,其中每一行是分隔带中像素的值)传递给这个函数,所以我需要写一个像这样循环:

for k1=1:2048  
   for k2=1:2048  
      pixel(:,1)=image(k1,k2,:); 
      Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix);  
   end  
end  

而且您知道这将花费系统的大量时间和精力。您能建议我一种减少施加在系统上的压力的方法吗?

4

1 回答 1

6

无需循环!

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

更新:

在下面的评论中进行了(有些激烈的)辩论之后,我添加了Rody Oldenhuis所做的更正:

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)) );

此更改的关键问题是 Matlab 的inv()实现很差,最好使用mldivideand mrdivide(运算符/and \)代替。

于 2013-06-17T20:48:29.413 回答