在MATLAB

时间:2015-06-11 04:00:00

标签: matlab matrix

我有三维逻辑矩阵,上半部分为0,下半部分为1(如用0来描述空气,用1来描述丘陵土壤)。例如:

a(:,:,1)=[0,0;0,0];
a(:,:,2)=[0,1;1,0];
a(:,:,3)=[1,1;1,0];
a(:,:,4)=[1,1;1,0];
a(:,:,5)=[1,1;1,0];

a的三个指数在这里表示为i,j和k。 我想得到的是一个名为a_mask的掩码矩阵,用于告知固定的i和j,其中出现0和1之间的接口。使用嵌套循环很简单:

a_mask=zeros(size(a) );
for i = 1 : size(a,1)
    for j=1: size(a,2)
        k_ind=find( a(i,j,:)==1,1);
        a_mask(i,j,k_ind)=1;
    end
end

我将得到一个预期的a_mask:

a_mask(:,:,1) =
 0     0
 0     0
a_mask(:,:,2) =
 0     1
 1     0
a_mask(:,:,3) =
 1     0
 0     0
a_mask(:,:,4) =
 0     0
 0     0
a_mask(:,:,5) =
 0     0
 0     0

我希望实现的是将流程矢量化以创建a_mask,以便显着提高速度。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的代码,则您有2D切片,并且对于每个唯一的行和列,您需要标识找到1的第一个切片的位置。从判断问题的方式来看,一旦我们为一个唯一的行和列命中1,我们假设该位置的其余切片是1s的连续运行,当我们下次达到0时,切片的其余部分为0。

你可以非常有说服力地进行矢量化:

a_mask = cumsum(a, 3) == 1;

此代码值得一些解释。我们对第三维进行累积求和。这意味着对于矩阵中的每个唯一空间位置,我们对每个3D列的累积总和以及我们在该列中第一次遇到1,当我们将此位置设置为1时,因为存在一堆零通过累积总和添加到此点。在此之后的任何一点,累积的总和不再为1,所以我们使用逻辑掩码将所有值清零,除了累积和为1时,我们得到结果。

我们得到:

>> a_mask

a_mask(:,:,1) =

     0     0
     0     0


a_mask(:,:,2) =

     0     1
     1     0


a_mask(:,:,3) =

     1     0
     0     0


a_mask(:,:,4) =

     0     0
     0     0


a_mask(:,:,5) =

     0     0
     0     0