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



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

我可以让它部分使用 result=A(:,:,1(==A(:,:,

2(,但我不确定如何也包含 A(:,:,3(我尝试了结果=A(:,:,1(==A(:,:,2(==A(:,:,3(,但是当应该有 1 个正确答案时,结果返回为全部 0这是数字 8 位于数组所有页面上的同一单元格中的位置。 注意:这只是一个测试,重复的数字可以多次找到,并且是不同的数字。

PS:我正在使用八度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
使用bsxfun(MATLAB doc,Octave doc

(并检查广播第一个切片是否在所有切片中相等,并调用all(MATLAB doc,Octave doc(:

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

如果我们在玩代码高尔夫,一个衬里可能是:

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(的唯一值。

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

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

你可以做

result = A(:,:,1) == A(:,:,2) & A(:,:,1) == A(:,:,3);
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)意味着我们正在取第三个维度的总和。然后我们将该总和除以维度数。它基本上是该位置在第三维度中的平均值。如果将三个值相加,然后将其除以 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(A == sum(A,3)./size(A,3)(进行比较时3x3x3矩阵。该比较的结果将是一个逻辑数组,其中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

相关内容

  • 没有找到相关文章

最新更新