arrays - 根据计数进行逐元素数组复制

标签 arrays matlab repeat run-length-encoding elementwise-operations

<分区>

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

举个例子,假设我有一个数组 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

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

最佳答案

这是我喜欢的一种方式:

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

关于arrays - 根据计数进行逐元素数组复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382319/

相关文章:

matlab - 从右到左对连接的组件进行排序

matlab - 以节点之间的链接绘制圆形节点网络

Javascript:5 个中的随机数,在全部使用之前不重复

ios - 每天固定时间运行一个任务

javascript - 设置新数组时,无法在 for 循环中设置未定义或 null 引用的属性 '0'

javascript - 如何显示预加载在二维数组中而不是占位符的图像切片?

java - 在 Java 中追加到数组

matlab - 如何估计/确定深度图像点的表面法线和切平面?

javascript - Angular 中的重复功能失败

JavaScript : How do i push new column/row to the JavaScript Array during for. .loop 迭代?