根据计数[重复]的元素数组复制

    这个问题在这里已有答案:                           重复数组元素的副本:MATLAB中的游程长度解码                                      5个答案                                    
已邀请:
这是我喜欢的一种方式:
>> index = zeros(1,sum(rep));
>> index(cumsum([1 rep(1:end-1)])) = 1;

index =

     1     0     1     0     0     1     1     0     0     0     0

>> index = cumsum(index)

index =

     1     1     2     2     2     3     4     4     4     4     4

>> vv = v(index)

vv =

     3     3     1     1     1     9     4     4     4     4     4
这首先创建一个零的索引向量,其长度与所有值的最终计数相同。通过执行
rep
向量的累积和去除最后一个元素并在开始时放置1,我得到一个索引向量
index
,显示复制值组的开始位置。这些点标有一些。当对
index
执行累积和时,我得到一个最终的索引向量,我可以用它来索引到
v
来创建非均匀复制值的向量。     
要添加可能的解决方案列表,请考虑以下问题:
vv = cellfun(@(a,b)repmat(a,1,b), num2cell(v), num2cell(rep), 'UniformOutput',0);
vv = [vv{:}];
这比gnovice的慢得多。     
你要做的是运行长度解码。高级可靠/矢量化实用程序是FEX提交
rude()
% example inputs
counts = [2, 3, 1];
values = [24,3,30];
结果
rude(counts, values)
ans =
    24    24     3     3     3    30
请注意,此函数也执行相反的操作,即行程编码向量或换句话说返回
values
和相应的
counts
。     
如果零在
rep
数组中退出,则可以使用
accumarray
函数使代码工作
function vv = repeatElements(v, rep)
index = accumarray(cumsum(rep)'+1, 1);
vv = v(cumsum(index(1:end-1))+1);
end
这类似于gnovice的解决方案,除了索引被累积而不是分配给1.这允许跳过一些索引(下面示例中的3和6)并从输出中删除相应的元素。
>> v = [3 1 42 9 4 42];
>> rep = [2 3 0 1 5 0];
>> index = accumarray(cumsum(rep)'+1, 1)'

index =

     0     0     1     0     0     2     1     0     0     0     0     2

>> cumsum(index(1:end-1))+1

ans =

     1     1     2     2     2     4     5     5     5     5     5

>> vv = v(cumsum(index(1:end-1))+1)

vv =

     3     3     1     1     1     9     4     4     4     4     4
    

要回复问题请先登录注册