从向量的小组索引传染媒介与在小组的元素的数量

时间:2014-08-07 08:44:23

标签: matlab run-length-encoding

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

示例:

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

但这看起来并不优雅。欢迎任何改进建议。

3 个答案:

答案 0 :(得分:3)

您正在寻找run length decoding 试试这个

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

请参阅ideone上的正在运行的示例。

答案 1 :(得分:2)

试试这个:

X = arrayfun(@(x) [1 zeros(1,x-1)], E, 'uni',0)
Y = cumsum( [X{:}] )

答案 2 :(得分:0)

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

这是我的解决方案:

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

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