在MATLAB中创建掩码矩阵识别三维逻辑矩阵的接口

在MATLAB中创建掩码矩阵识别三维逻辑矩阵的接口,matlab,matrix,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。 我希望得到的是一个称为_mask的掩码矩阵,它告诉固定的I和j,0和1之间的接口出现在哪里。使用嵌套循环非常简单: a_mask=zeros(size(a)

我有一个三维逻辑矩阵,上面的部分是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。 我希望得到的是一个称为_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_面具,如下所示:

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

我希望实现的是将过程矢量化,以创建一个_掩码,从而显著提高速度。

如果我正确理解了您的代码,您有2D切片,并且对于每个唯一的行和列,您希望标识找到1的第一个切片的位置。从您处理问题的方式来看,一旦我们为唯一的行和列命中1,我们假设此位置的其余切片是连续运行的1,下次命中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

我回答你的问题了吗?非常感谢@rayryeng,这一行正是我要找的!酷!很高兴我帮了忙!感谢您的回复:)