分组元素的单元格

Cell of grouped elements

我有一个链表S,S(i)=s_i,S(i)是一个非负整数。 我想要一个单元格 C=C{0+1},...C{max(S)+1} 这样 C{i+1}={i_1,...,i_k }, S(i_1)=...=S(i_k)=i 并且 k 是最大的。 示例:

S(1)=0,S(2)=0,S(3)=1,S(4)=2,S(5)=1,S(6)=2,S(7)=6,

那我应该得到

 C{0+1}={1,2}, C{1+1}={3,5}, C{2+1}={4,6}, C{3+1}={},...C{6+1}={7}, C{7+1}={}

如何在 matlab 中尽快做到这一点?

我已经找到了

Place equal elements in cell array

但是,我还需要像 C{3+1} 中那样的空集。

我该怎么做?

使用accumarray可以很容易地完成:

C = accumarray(S(:)+1, 1:numel(S), [], @(x) {sort(x.')});

这是 bsxfun and mat2cell 的替代方法:

t = bsxfun(@eq, S(:), 0:max(S));
s = sum(t, 1);
t = bsxfun(@times, t, (1:numel(S)).');
C = mat2cell(nonzeros(t).', 1, s);