如何在多维数组中找到所有具有相同值的单元格?
我可以让它部分使用 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