给定组号的向量value="${((contains == 'false') && (facultyMember eq true)) ? prepTime : ''}"/>
(例如由A
返回的那个),如何返回包含{的组内元素索引的相同长度的向量findgroups
{1}}?
例如,如果B
则A
。
添加1
我自己的解决方案是
A = [1 1 1 2 2 2 1 1 2 2]
但似乎有点令人费解。
答案 0 :(得分:3)
使用sort
和accumarray
的解决方案:
[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