簡體   English   中英

刪除任何兩個差值是該數組成員的數組值

[英]Removing any two array values whose difference is a member of that array

我正在嘗試刪除其值是MATLAB中該數組的成員的數組值。 例如,如果我有一個定義為的數組

x = [1 2 4 3 7];

我想刪除2,因為它可以從4-2實現。我也想刪除4,因為它可以從7-3實現。然后,我想將這些值(分別為2和4)存儲到矩陣。 后者很容易。 我很難進行此檢查器的求和。

我知道你可以用

ismember(*any 2 differences*),x(:))

檢查差異是否在數組中。 但是,我不知道如何編碼我的函數來嘗試元素減法的所有組合。

似乎是使用bsxfun的好設置-

abs_diffs = abs(bsxfun(@minus,x(:),x(:).'))  %//'

unq_abs_diffs = unique(abs_diffs)

out = x(~any(bsxfun(@eq,unq_abs_diffs(:),x(:).'),1))   %//'
%// OR x(~ismember(x,unq_abs_diffs))

樣品運行-

>> 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無法刪除。

您可以這樣做:

n = length(a);
differences = meshgrid(a,a) - meshgrid(a,a)'; % get differences between elements
differences(1:n+1:n*n) = []; % remove diagonal
a(ismember(a,differences)) = []; % remove elements in differences

我假設您只想要唯一元素之間的差異。 如果要允許a元素與其自身之間的差異,請刪除第三行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM