检查 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
将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 列具有所有相同的值。一旦您 运行 完成 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)
用于所需的二维数组输出。
例如,我有一个 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
将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 列具有所有相同的值。一旦您 运行 完成 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)
用于所需的二维数组输出。