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

Ric*_*k T 2 arrays matlab octave multidimensional-array

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

我可以部分地使用 result = A(:,:,1)== A(:,:,2),但我不知道如何也包括A(:,:,3) 我试过结果= A(:,:,1)== A(:,:,2)== A(:,:,3)但是当应该有1个正确答案时,结果将返回全0,其中数字8是位于阵列所有页面上的同一单元格中.注意:这只是一个测试,可以多次找到重复的数字和不同的数字.

PS:我使用octave 3.8.1,就像matlab一样

见下面的代码:

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
Run Code Online (Sandbox Code Playgroud)

这是它给我的输出:

>>>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
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 5

使用bsxfun(MATLAB doc,Octave doc)并通过调用all(MATLAB doc,Octave doc)检查所有切片中第一个切片的广播是否相等:

B = bsxfun(@eq, A, A(:,:,1));
result = all(B, 3);
Run Code Online (Sandbox Code Playgroud)

如果我们正在玩代码高尔夫,那么一个衬垫可能是:

result = all(bsxfun(@eq, A, A(:,:,1)), 3);
Run Code Online (Sandbox Code Playgroud)

上述方法的优点在于,您可以在第三维中拥有任意数量的切片,而不仅仅是三个切片.

%// Your data
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];

B = bsxfun(@eq, A, A(:,:,1));
result = all(B, 3);
Run Code Online (Sandbox Code Playgroud)

... 给我们:

>> result

result =

     0     0     0
     0     0     0
     0     0     1
Run Code Online (Sandbox Code Playgroud)

以上是有意义的,因为所有切片的第三行和第三列是每个切片共享该相同值(即8)的唯一值.