Arrays 如何在octave/matlab中找到多维数组中具有相同值的所有单元格

Arrays 如何在octave/matlab中找到多维数组中具有相同值的所有单元格,arrays,matlab,multidimensional-array,octave,Arrays,Matlab,Multidimensional Array,Octave,如何在多维数组中找到所有具有相同值的单元格 我可以部分地使用result=A(:,:,1)==A(:,:,2),但我不确定如何也包括A(:,:,3) 我尝试了result=A(:,:,1)==A(:,:,2)==A(:,:,3),但是当应该有1个正确答案时,结果返回为全部0 在数组的所有页面上,数字8位于同一单元格中。注意:这只是一个测试,重复的数字可能会被发现多次,并作为不同的数字 PS:我使用的是类似于matlab的倍频程3.8.1 见下面的代码: clear all, tic %graph

如何在多维数组中找到所有具有相同值的单元格

我可以部分地使用result=A(:,:,1)==A(:,:,2),但我不确定如何也包括A(:,:,3) 我尝试了result=A(:,:,1)==A(:,:,2)==A(:,:,3),但是当应该有1个正确答案时,结果返回为全部0 在数组的所有页面上,数字8位于同一单元格中。注意:这只是一个测试,重复的数字可能会被发现多次,并作为不同的数字

PS:我使用的是类似于matlab的倍频程3.8.1

见下面的代码:

clear all, tic
%graphics_toolkit gnuplot %use this for now it's older but allows zoom
A(:,:,1)=[1 2 3; 4 5 6; 7 9 8]; A(:,:,2)=[9 1 7; 6 5 4; 7 2 8]; A(:,:,3)=[2 4 6; 8 9 1; 3 5 8] 
[i j k]=size(A)
for ii=1:k
    maxamp(ii)=max(max(A(:,:,ii)))
    Ainv(:,:,ii)=abs(A(:,:,ii)-maxamp(ii));%the extra max will get the max value of all values in array
end

%result=A(:,:,1)==A(:,:,2)==A(:,:,3)
result=A(:,:,1)==A(:,:,2)
result=double(result); %turns  logical index into double to do find
[row col page] = find(result) %gives me the col, row, page
这是它给我的输出:

>>>A =

ans(:,:,1) =

   1   2   3
   4   5   6
   7   9   8

ans(:,:,2) =

   9   1   7
   6   5   4
   7   2   8

ans(:,:,3) =

   2   4   6
   8   9   1
   3   5   8

i =  3
j =  3
k =  3
maxamp =  9
maxamp =

   9   9

maxamp =

   9   9   9

result =

   0   0   0
   0   1   0
   1   0   1

row =

   3
   2
   3

col =

   1
   2
   3

page =

   1
   1
   1
你能行

result = A(:,:,1) == A(:,:,2) & A(:,:,1) == A(:,:,3);
使用
bsxfun
(,)并通过调用
all
(,)检查广播第一个片段在所有片段中是否相等:

如果我们在玩,一行可以是:

result = all(bsxfun(@eq, A, A(:,:,1)), 3);
上述方法的优点在于,在三维空间中,除了三个切片外,还可以有任意多个切片

例子 。。。给了我们:

>> result

result =

     0     0     0
     0     0     0
     0     0     1

由于所有切片的第三行和第三列是每个切片共享相同值(即8)的唯一值,因此上述方法是有意义的。

这里有另一种方法:沿三维计算差异,并检测所有差异何时为零:

result = ~any(diff(A,[],3),3);
沿着第三维度的元素,并将其与维度数分开。如果所有维度上的值都相同,我们将返回原始值。否则,应使用不同的(如十进制)值。然后找到
A
与第三维总和相等的位置

all( A == sum(A,3)./size(A,3),3)

ans =

0   0   0
0   0   0
0   0   1
A == sum(A,3)./size(A,3)
ans =

ans(:,:,1) =

   0   0   0
   0   0   0
   0   0   1

ans(:,:,2) =

   0   0   0
   1   0   0
   0   0   1

ans(:,:,3) =

   0   0   0
   0   0   0
   0   0   1
all( A == sum(A,3)./size(A,3),3)
ans =

   0   0   0
   0   0   0
   0   0   1

你也可以这样做

all(A==repmat(sum(A,3)./size(A,3),[1 1 size(A,3)]),3)
其中,
repmat(sum(A,3)。/size(A,3),[11 size(A,3)])
A
相比,将突出显示此的隐式广播

您完全跳过广播,只需将其与
A

A(:,:,1) == sum(A,3)./size(A,3)

解释
3
表示第三维。
sum(A,3)
表示我们在第三维度上求和。 然后我们把这个总和除以维数。 它基本上是第三维度中该位置的平均值。 如果您添加三个值,然后将其除以三,那么您将得到原始值。 例如,
A(3,3,:)
[8]
<代码>(8+8+8)/3=8。 如果再举一个例子,即上面的值,
A(2,3,:)=[6 4 1]
。 然后
(6+4+1)/3=3.667
。这不等于
A(2,3,:)

因此,我们知道元素是不一样的 在整个第三维度。这只是我使用的一个技巧 为了确定这一点。你也要记住这一点
sum(A,3)。/size(A,3)
最初是一个
3x3x1
矩阵 将自动扩展(即广播)到 当我们与
A
进行比较时,
3x3x3
矩阵(
A==sum(A,3)。/size(A,3)
)。 该比较的结果将是一个逻辑数组,在整个第三维中位置相同,且
1

all( A == sum(A,3)./size(A,3),3)

ans =

0   0   0
0   0   0
0   0   1
A == sum(A,3)./size(A,3)
ans =

ans(:,:,1) =

   0   0   0
   0   0   0
   0   0   1

ans(:,:,2) =

   0   0   0
   1   0   0
   0   0   1

ans(:,:,3) =

   0   0   0
   0   0   0
   0   0   1
all( A == sum(A,3)./size(A,3),3)
ans =

   0   0   0
   0   0   0
   0   0   1
然后使用
all(..,3)
获取这些。结果是
3x3x1
矩阵中的
1
表示该值在 第三维度

all( A == sum(A,3)./size(A,3),3)

ans =

0   0   0
0   0   0
0   0   1
A == sum(A,3)./size(A,3)
ans =

ans(:,:,1) =

   0   0   0
   0   0   0
   0   0   1

ans(:,:,2) =

   0   0   0
   1   0   0
   0   0   1

ans(:,:,3) =

   0   0   0
   0   0   0
   0   0   1
all( A == sum(A,3)./size(A,3),3)
ans =

   0   0   0
   0   0   0
   0   0   1

美好的这可能比
bsxfun
具有更低的内存占用。这是一种很好且优雅的方法it@Luis门多看起来很不错,但是如果我有2x5x7(2行5列7维),你知道我如何适应这个问题吗我对3代表我做3x3x3示例的错误感到有点迷茫。@RickT这两个数字
3
表示“三维”,所以对于任何三维图形,它都应该在不改变任何内容的情况下工作array@RickT正如我所说的,不要改变这一点。它意味着第三维度,而不是第三维度的大小。因此:对任何3D阵列使用
result=~any(diff(A,[],3),3)
这看起来很棒,但是你知道如果我有2x5x7(2行5列7维),如何适应它吗?我对3代表我做3x3x3示例的错误有点迷茫。我刚刚尝试了一个
2x5x4
示例,而且也可以。这似乎有很多困惑,所以我添加了更多的解释。我认为
A(:,:,1)=和(A,3)。/size(A,3)
是最有效的。请看更新后的帖子。希望这有帮助…这看起来很棒,但你知道如果我有2x5x7(2行5列和7维),我对3表示我做3x3x3示例的错误有点迷茫。只要你有一个3D矩阵,这个示例应该可以工作。我不明白你说的“7维”是什么意思。你是说7片,每片2 x 5?要么是我的答案,要么是路易斯·门多的答案。