我有三维逻辑矩阵,上半部分为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,以便显着提高速度。
答案 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