Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用Matlab查找和索引数组中的重复元素_Arrays_Matlab - Fatal编程技术网

Arrays 使用Matlab查找和索引数组中的重复元素

Arrays 使用Matlab查找和索引数组中的重复元素,arrays,matlab,Arrays,Matlab,我有一个数组A=[10203001050] 是否有任何聪明的方法来查找和定位此数组的重复元素 i、 e 我尝试使用unique,但失败了…这里有一个解决方案: % input array A = [10 20 20 30 40 10 50]; % find unique elements (vals), and map values of A to indices (valsIdx) [vals,~,valsIdx] = unique(A); % group element location

我有一个数组
A=[10203001050]

是否有任何聪明的方法来查找和定位此数组的重复元素

i、 e

我尝试使用
unique
,但失败了…

这里有一个解决方案:

% input array
A = [10 20 20 30 40 10 50];

% find unique elements (vals), and map values of A to indices (valsIdx)
[vals,~,valsIdx] = unique(A);

% group element locations by the above indices mapping
locs = accumarray(valsIdx, 1:numel(valsIdx), [], @(x){sort(x)});

% keep only values that are repeated
idx = cellfun(@numel, locs) > 1;
vals = vals(idx);
locs = locs(idx);
结果是:

vals =
    10    20
locs = 
    [2x1 double]
    [2x1 double]

>> celldisp(locs)
locs{1} =
     1
     6
locs{2} =
     2
     3
这里有一个解决方案:

% input array
A = [10 20 20 30 40 10 50];

% find unique elements (vals), and map values of A to indices (valsIdx)
[vals,~,valsIdx] = unique(A);

% group element locations by the above indices mapping
locs = accumarray(valsIdx, 1:numel(valsIdx), [], @(x){sort(x)});

% keep only values that are repeated
idx = cellfun(@numel, locs) > 1;
vals = vals(idx);
locs = locs(idx);
结果是:

vals =
    10    20
locs = 
    [2x1 double]
    [2x1 double]

>> celldisp(locs)
locs{1} =
     1
     6
locs{2} =
     2
     3
下面是另一个:

>> A = [10 20 20 30 40 10 50];
>> S = sort(A);
>> S = arrayfun(@(x) [x find(x==A)], unique(S(diff(S)==0)), 'UniformOutput', false);
>> S{:}
ans =
    10     1     6
ans =
    20     2     3
如果您没有或想要使用
arrayfun
,可以使用普通循环:

A = [10 20 20 20 30 40 10 50];

S = sort(A);
S = unique(S(diff(S)==0));

R = cell(size(S'));
for ii = 1:numel(S)
    R{ii} = [S(ii) find(A==S(ii))]; end
下面是另一个:

>> A = [10 20 20 30 40 10 50];
>> S = sort(A);
>> S = arrayfun(@(x) [x find(x==A)], unique(S(diff(S)==0)), 'UniformOutput', false);
>> S{:}
ans =
    10     1     6
ans =
    20     2     3
如果您没有或想要使用
arrayfun
,可以使用普通循环:

A = [10 20 20 20 30 40 10 50];

S = sort(A);
S = unique(S(diff(S)==0));

R = cell(size(S'));
for ii = 1:numel(S)
    R{ii} = [S(ii) find(A==S(ii))]; end

此解决方案仅返回值,而不返回值的索引(位置)。

%Your Data
A=[10 20 20 30 40 10 50]; 
%sorted Data
A_sorted=sort(A);
%find the duplicates
idx=find(diff(A_sorted)==0);
% the unique is needed when there are more than two duplicates.
result=unique(A_sorted(idx)); 

此解决方案仅返回值,而不返回值的索引(位置)。

%Your Data
A=[10 20 20 30 40 10 50]; 
%sorted Data
A_sorted=sort(A);
%find the duplicates
idx=find(diff(A_sorted)==0);
% the unique is needed when there are more than two duplicates.
result=unique(A_sorted(idx)); 

使用
bsxfun
arrayfun

comp = tril(bsxfun(@eq, A(:), A(:).')); %'// compare all pairs of values
ind = find(sum(comp)>1); %// find repeated values
values = A(ind);
positions = arrayfun(@(n) find(comp(:,n).'.*(1:numel(A))), ind, 'uni', 0);
这使得:

>> values
values =
    10    20

>> positions{:}
ans =
     1     6

ans =
     2     3

使用
bsxfun
arrayfun

comp = tril(bsxfun(@eq, A(:), A(:).')); %'// compare all pairs of values
ind = find(sum(comp)>1); %// find repeated values
values = A(ind);
positions = arrayfun(@(n) find(comp(:,n).'.*(1:numel(A))), ind, 'uni', 0);
这使得:

>> values
values =
    10    20

>> positions{:}
ans =
     1     6

ans =
     2     3


您是如何使用
unique
?您是如何使用
unique
?它可以检测重复值,但我还需要初始数组的索引(即A(1)和A(6)、A(2)和A(3)。其他解决方案也可以这样做。我可以实现“它们的”我的解决方案,但这不是真正有用的,是吗?它检测重复值,但我还需要初始数组的索引(即A(1)和A(6),A(2)和A(3)。其他解决方案也这样做。我可以实现“它们的”我的解决方案,但这不是真正有用的,是吗?我使用的是旧版本的Matlab。arrayfun不是supported@user3270686:然后使用普通循环:)@user3270686:…你会感到惊讶。@user3270686:例如,阅读。@TheMinion:我认为最重要的一点是,即使对于
N
非常大,所有方法的计算时间都在十分之一秒或更少的数量级。除非在某些超高级数字运算算法的内核中需要此功能,否则at被用来预测未来100年的准确气候(如此大的数据+非常频繁的调用;在这种情况下,我建议使用一种完全不同的语言),我会说它“足够快”,我们在这里真正讨论的是微观优化:)我使用的是旧版本的Matlab。arrayfun不是supported@user3270686:然后使用一个简单的循环:)@user3270686:…您会感到惊讶。@user3270686:例如,阅读。@TheMinion:我认为最重要的一点是,即使对于
N
非常大,所有方法的计算时间都在十分之一秒或更少的数量级。除非在某些超级先进的数字运算算法的内核中需要这种功能,这些算法被用来预测未来100年的准确气候(如此大的数据+非常频繁的调用;在这种情况下,我建议使用一种完全不同的语言),否则我会说它“足够快”,我们在这里真正讨论的是微观优化:)您的解决方案运行良好。我不明白的是:
loc
中元素的顺序是如何定义的?我在
30 40
之间插入了另一个
20
,而
loc{2}
的结果是:
3 5 2
索引是正确的,但它没有以我理解的任何方式排序。通常,我会怀疑它是排序的还是反向排序的。介意稍微解释一下你的代码吗?@TheMinion:done,我添加了一些注释并修复了要始终排序的位置。(旁注:accumarray的顺序有点奇怪,如果你想了解更多,请阅读这篇文章:)你的解决方案运行良好。我不明白的是:
loc
中元素的顺序是如何定义的?我在
30 40
之间插入了另一个
20
,而
loc{2}
的结果是:
3 5 2
索引是正确的,但它没有以我理解的任何方式排序。通常,我会怀疑它是排序的还是反向排序的。介意稍微解释一下你的代码吗?@TheMinion:done,我添加了一些注释并修复了要始终排序的位置。(旁注:accumarray的订单有点奇怪,如果你想了解更多,请阅读这篇文章:)