我有一个单元格数组
A = {'hello'; 2; 3; 4; 'hello';2;'hello'}
Run Code Online (Sandbox Code Playgroud)
我想找到这个数组中是否有重复,并确定它们的名称和索引.在这个例子中,我希望有类似的东西:
names = {'hello';2};
indexes = [1, 5, 7;
2, 6, 0];
Run Code Online (Sandbox Code Playgroud)
我把第二行索引的最后一个元素放到0只是为了没有维度问题...我的问题是单元格数组既是char又是double ...我不知道如何处理这个...
虽然很乱,但是可以做到:
m = max(cellfun(@length, A));
A2 = cellfun(@(e) [double(e) inf(1,m-length(e)) ischar(e)], A, 'uni' ,false);
A2 = cell2mat(A2);
[~, ~, jj] = unique(A2,'rows');
num = accumarray(jj,1,[],@numel);
[~, kk] = max(bsxfun(@eq, jj, find(num>1).'));
names = A(kk);
indices = arrayfun(@(n) find(jj==jj(kk(n))), 1:length(kk), 'uni', false);
Run Code Online (Sandbox Code Playgroud)
这是如何工作的:A2只是A转换为数字矩阵。每行代表 的一个条目A,最后一列用作区分原始数字和原始字符串的标志,并inf用作填充符。然后,通常的夫妇unique进行实际工作,并通过一些比较和索引accumarray获得结果。jjnum