检查 3D 矩阵 Matlab 的元素明智相等性

Check element wise equality of a 3D matrix Matlab

例如,我有一个 3D 矩阵。 A(10x5x8)。我需要从中得到一个大小为 10x5 的二维矩阵(布尔值)。

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

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 列具有所有相同的值。一旦您 运行 完成 post 开头的代码,我们就会得到您所期望的。

这是简短而有趣的 diff 并且必须非常有效地存储内存 -

out = ~any(diff(A,[],3),3)

因此,基本上使用 diff 沿第三维 diff(..[],3),您将计算相同 (i,j) 但在不同 3D 切片上的差异。因此,如果所有此类 diff 输出都是 zeros,则表明相同 (i,j) 的所有 dim3 元素是相同的。这个 all zeros 信息随后被 ~any() 拾取 并且 dim3~any(.,3) 用于所需的二维数组输出。