2

我想从包含每个组中元素数量的向量创建一个包含每个元素的组标识符的向量。

例子:

E = [2 3 4]'

我正在寻找如下向量:

I = [1 1 2 2 2 3 3 3 3]

我找到了一个涉及循环的解决方案:

I = [];
for e=1:size(E,1),
    I = [I ; e*ones(E(e),1)];
end

但这似乎不是很优雅。欢迎任何改进建议。

4

3 回答 3

3

您正在寻找运行长度解码
试试这个

n = sum( E ); %// tot number of elelments
I = zeros( 1, n ); % //preallocate!
I(cumsum( [ 1 E(1:end-1) ] ) ) = 1;
I = cumsum( I )

请参阅ideone的运行示例。

于 2014-08-07T09:00:05.467 回答
2

试试这个:

X = arrayfun(@(x) [1 zeros(1,x-1)], E, 'uni',0)
Y = cumsum( [X{:}] )
于 2014-08-07T08:58:14.433 回答
0

我有一个类似的问题。我认为,如果不使用 for 循环,它并不像人们想象的那么简单。

这是我的解决方案:

I = cell2mat(arrayfun(@(x) repmat(x,E(x),1),1:numel(E),'UniformOutput',false)') 

一些解释:x 是 E 的索引。数组函数“迭代”从 1 到 numel(E)。repmat 复制索引 x E(x) 次。数组函数的输出是一个带有向量 [11]、[222] 和 [3333] 的 1x3 元胞数组。由于向量大小不同,我必须将 Uniformoutput 设置为 false。但我想连接这些嵌套向量,所以我使用 cell2mat(...)

于 2014-08-07T09:05:51.267 回答