组内的MATLAB索引

时间:2017-12-04 16:13:36

标签: matlab

给定组号的向量value="${((contains == 'false') && (facultyMember eq true)) ? prepTime : ''}"/> (例如由A返回的那个),如何返回包含{的组内元素索引的相同长度的向量findgroups {1}}?

例如,如果BA

添加1

我自己的解决方案是

A = [1 1 1 2 2 2 1 1 2 2]

但似乎有点令人费解。

4 个答案:

答案 0 :(得分:3)

使用sortaccumarray的解决方案:

[s is]=sort(A);
idx = accumarray(s(:),1,[],@(x){1:numel(x)});
B(is)=[idx{:}];

使用图像处理工具箱的另一种解决方案:

p=regionprops(A,'PixelIdxList');
B = zeros(size(A));
for k = 1: numel(p)
    B(p(k).PixelIdxList) = 1:numel(p(k).PixelIdxList);
end

答案 1 :(得分:2)

这是一个可能看起来不那么紧凑的解决方案,但由于它使用cumsum并编制索引,因此速度非常快:

mA = max(A);
nA = numel(A);
ind = false(mA, nA);
ind(mA.*(0:(nA-1))+A) = true;
B = cumsum(ind, 2);
B = B(ind).';

以下是目前解决方案的一些时间结果:

A = [1 1 1 2 2 2 1 1 2 2];

rahnema1: 6.51343e-05
    Luis: 3.00891e-05
     OmG: 2.36826e-05
 gnovice: 4.93539e-06  % <---

A = randi(20, 1, 1000);

rahnema1: 0.000274138
    Luis: 0.000257126
     OmG: 0.000233348
 gnovice: 9.95673e-05  % <---

A = randi(20, 1, 10000);

rahnema1: 0.00162955
    Luis: 0.00163943
     OmG: 0.00126571
 gnovice: 0.00107134  % <---

对于上述测试用例,我的解决方案速度最快(中等大小,中等数量的唯一值)。对于较大的案例,其他解决方案获得优势。来自rahnema1的解决方案似乎做得更好,因为A中的唯一值数量增加,而来自OmG的基本for循环在A中的元素数量时效果更好增加(相对较少的唯一值):

>> A = randi(200, 1, 100000);

rahnema1: 0.0108024  % <---
    Luis: 0.0931876
     OmG: 0.0427542
 gnovice: 0.0815516

>> A = randi(20, 1, 1000000);

rahnema1: 0.131256
    Luis: 0.171415
     OmG: 0.106548  % <---
 gnovice: 0.124446

答案 2 :(得分:1)

这是一种避免循环的方法:

s = bsxfun(@eq, A(:).', unique(A(:))); % Or, in recent versions, s = A==unique(A).';
t = cumsum(s,2);
B = reshape(t(s), size(A));

答案 3 :(得分:1)

解决方案可以使用循环来替换A中的值:

c = unique(A);
B= A;
for (idx = c)
    f = find(A == idx);
    B(f) = 1:length(f);
 end