8

我的问题与这个问题类似但我想根据在第二个相同大小的数组中指定的计数来复制每个元素。

举个例子,假设我有一个数组v = [3 1 9 4],我想用它rep = [2 3 1 5]来复制第一个元素 2 次,第二个元素 3 次,依此类推得到[3 3 1 1 1 9 4 4 4 4 4].

到目前为止,我正在使用一个简单的循环来完成工作。这是我开始的:

vv = [];
for i=1:numel(v)
    vv = [vv repmat(v(i),1,rep(i))];
end

我设法通过预先分配空间来改进:

vv = zeros(1,sum(rep));
c = cumsum([1 rep]);
for i=1:numel(v)
    vv(c(i):c(i)+rep(i)-1) = repmat(v(i),1,rep(i));
end

但是我仍然觉得必须有一个更聪明的方法来做到这一点......谢谢

4

4 回答 4

16

这是我喜欢完成此任务的一种方法:

>> 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以创建异构复制值的向量。

于 2010-03-04T20:10:12.813 回答
2

要添加到可能的解决方案列表中,请考虑以下解决方案:

vv = cellfun(@(a,b)repmat(a,1,b), num2cell(v), num2cell(rep), 'UniformOutput',0);
vv = [vv{:}];

这比gnovice的慢得多..

于 2010-03-04T20:46:57.557 回答
0

您要做的是运行长度 decode。高级可靠/矢量化实用程序是FEX 提交rude()

% example inputs
counts = [2, 3, 1];
values = [24,3,30];

结果

rude(counts, values)
ans =
    24    24     3     3     3    30

请注意,此函数也执行相反的操作,即游程对向量进行编码,或者换句话说,返回values和对应的counts.

于 2013-08-21T13:23:49.443 回答
0

accumarrayrep如果数组中存在零,函数可用于使代码工作

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
于 2014-10-17T12:01:45.910 回答