Arrays 删除差异为该数组成员的任意两个数组值

Arrays 删除差异为该数组成员的任意两个数组值,arrays,matlab,Arrays,Matlab,我试图删除数组值,其差值是MATLAB中该数组的一个成员。例如,如果我有一个数组定义为 x = [1 2 4 3 7]; 我想删除2,因为它可以从4-2实现。我还想删除4,因为它可以从7-3实现。然后我想将这些值(分别为2和4)存储到一个矩阵中。后者很容易。我只是很难做这个求和的检查 我知道你可以用 ismember(*any 2 differences*),x(:)) 检查数组中是否存在差异。然而,我不知道如何编写我的函数来尝试所有元素减法的组合 您可以这样做: n=长度(a); 差异=

我试图删除数组值,其差值是MATLAB中该数组的一个成员。例如,如果我有一个数组定义为

x = [1 2 4 3 7];
我想删除2,因为它可以从4-2实现。我还想删除4,因为它可以从7-3实现。然后我想将这些值(分别为2和4)存储到一个矩阵中。后者很容易。我只是很难做这个求和的检查

我知道你可以用

ismember(*any 2 differences*),x(:))
检查数组中是否存在差异。然而,我不知道如何编写我的函数来尝试所有元素减法的组合

您可以这样做:

n=长度(a);
差异=网格网格(a,a)-网格网格(a,a);%获取元素之间的差异
差异(1:n+1:n*n)=[];%删除对角线
a(成员(a,差异))=[];%删除差异中的元素

我假设您只想要独特元素之间的差异。如果要允许
a
的元素与自身之间存在差异,请删除第三行。

似乎是一个很好的设置-

样本运行-

>> x
x =
     1     2     4     3     7
>> abs_diffs = abs(bsxfun(@minus,x(:),x(:).'))
abs_diffs =
     0     1     3     2     6
     1     0     2     1     5
     3     2     0     1     3
     2     1     1     0     4
     6     5     3     4     0
>> unq_abs_diffs = unique(abs_diffs)
unq_abs_diffs =
     0
     1
     2
     3
     4
     5
     6
>> out = x(~any(bsxfun(@eq,unq_abs_diffs(:),x(:).'),1))
out =
     7

因此,在
[1 2 4 3 7]
中,只有
7
看起来是无法删除的。

不应该也删除
1
,因为
2-1=1
?另外,
7-4=3
,那么是否也删除
3
>> x
x =
     1     2     4     3     7
>> abs_diffs = abs(bsxfun(@minus,x(:),x(:).'))
abs_diffs =
     0     1     3     2     6
     1     0     2     1     5
     3     2     0     1     3
     2     1     1     0     4
     6     5     3     4     0
>> unq_abs_diffs = unique(abs_diffs)
unq_abs_diffs =
     0
     1
     2
     3
     4
     5
     6
>> out = x(~any(bsxfun(@eq,unq_abs_diffs(:),x(:).'),1))
out =
     7