检查3D矩阵Matlab的元素明确等式

时间:2015-04-06 16:37:39

标签: matlab matrix vectorization

我有一个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

2 个答案:

答案 0 :(得分:2)

bsxfuneq函数一起使用,并将第一个切片用作第一个输入,并与第二个输入的其他切片进行比较。允许第一个输入在多个切片上广播。

完成后,请使用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数组输出。