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

时间:2015-07-06 20:31:55

标签: arrays matlab multidimensional-array octave

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

我可以部分地使用 result = A(:,:,1)== A(:,:,2),但我不知道如何也包含 A(:,:,3) 我试过 result = A(:,:,1)== A(:,:,2)== A(:,:,3)但结果回到全0时应该是1个正确的答案 数字 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

这是它给我的输出:

>>>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

4 个答案:

答案 0 :(得分:5)

使用bsxfunMATLAB docOctave doc)并通过调用all({{3})检查所有切片中广播第一个切片是否相等},MATLAB doc):

B = bsxfun(@eq, A, A(:,:,1));
result = all(B, 3);

如果我们正在玩Octave doc,则可以是:

result = all(bsxfun(@eq, A, A(:,:,1)), 3);

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

实施例

%// 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);

...给我们:

>> result

result =

     0     0     0
     0     0     0
     0     0     1

以上是有道理的,因为所有切片的第三行和第三列是唯一的值,其中每个切片共享同一个值(即8)。

答案 1 :(得分:4)

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

result = ~any(diff(A,[],3),3);

答案 2 :(得分:2)

你可以做到

result = A(:,:,1) == A(:,:,2) & A(:,:,1) == A(:,:,3);

答案 3 :(得分:2)

sum沿第三维的元素,并将其除以维数。如果值在所有维度中相同,则返回原始值。否则是不同的(例如十进制)值。然后找到A的位置,并且总和在第三维上相等。

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),[1 1 size(A,3)])相比,A会突出显示此隐式广播。

<强>

你完全跳过广播,只是将它与第一片A

进行比较
A(:,:,1) == sum(A,3)./size(A,3)

解释

3代表第三个维度。 sum(A,3)意味着我们将总和超过第三维度。 然后我们将这个总和除以维数。 它基本上是第三维中该位置的平均值。 如果添加三个值然后除以三,则返回原始值。 例如,A(3,3,:)[8 8 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)
ans =

   4.0000   2.3333   5.3333
   6.0000   6.3333   3.6667
   5.6667   5.3333   8.0000

因此,我们知道元素不一样 贯穿第三个维度。这只是我使用的一个技巧 确定。你还必须记住这一点 sum(A,3)./size(A,3)最初是3x3x1矩阵 将自动扩展(即广播)到a 我们与3x3x3A)进行比较时会A == sum(A,3)./size(A,3)矩阵。 该比较的结果将是具有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(....,3)来获取这些内容。结果是3x3x1 矩阵,其中1表示值中的值相同 第三维。

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

   0   0   0
   0   0   0
   0   0   1