我有一个3D矩阵说例如。 A(10x5x8)
。我需要得到一个大小为10x5
的2D矩阵(布尔值)。
True
如果其元素3维值全部相同。即Result(1,1) = 1
如果A(1,1,1) == A(1,1,2) == A(1,1,3)
等等。
False
如果至少有一个是不同的。
我期待一种快速有效的矢量化方法。
示例输入:
A(:,:,1) = 1 2
2 2
A(:,:,2) = 1 1
2 3
预期输出:
Result = 1 0
1 0
答案 0 :(得分:2)
将bsxfun
与eq
函数一起使用,并将第一个切片用作第一个输入,并与第二个输入的其他切片进行比较。允许第一个输入在多个切片上广播。
完成后,请使用all
并检查第三维:
ind1 = bsxfun(@eq, A(:,:,1), A(:,:,2:end);
ind2 = all(ind1, 3);
上面的逻辑非常简单。第一行代码的工作原理是,您将创建一个临时矩阵,该矩阵将采用A
的第一个切片,并让它复制自己与A
中的切片一样多,而没有第一个切片。执行此操作后,您将使用此临时矩阵和其他切片执行逐元素相等的操作。如果您的3D列完全相同,则第一个切片中的一个元素将与对应于同一个3D列的每个值进行比较。如果它们彼此相等,那么您将获得所有逻辑1的3D列。因此,要使3D列彼此相等,所有值都应为1,这就是使用all
的原因 - 检查3D列中的所有值是否等于1.如果3D列是逻辑1,我们已经符合您的标准。
>> A1 = [1 2; 2 2];
>> A2 = [1 1; 2 3];
>> A3 = [1 3; 2 4];
>> A4 = [1 5; 2 6];
>> A = cat(3, A1, A2, A3, A4);
>> ind1 = bsxfun(@eq, A(:,:,1), A(:,:,2:end);
>> ind2 = all(ind1, 3)
ind2 =
1 0
1 0
我制作了一个包含4个切片的矩阵,其中左上角和左下角的3D列具有所有相同的值。一旦您在帖子开头处运行代码,我们就会得到您期望的结果。
答案 1 :(得分:2)
这里有短而甜蜜的diff
并且必须具有相当的记忆效率 -
out = ~any(diff(A,[],3),3)
因此,基本上沿着第三维diff
使用diff(..[],3)
,您可以计算相同(i,j)之间但在不同3D
切片上的差异。因此,如果所有此类diff
输出均为zeros
,则表示同一dim3
的所有(i,j)
元素都相同。然后,all zeros
也会~any()
<{>} 选择<{em>>信息<{1}},dim3
~any(.,3)
以获取所需的2D数组输出。