首頁>Program>source

我的問题与此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

但是我仍然覺得必须有一種更聪明的方法来執行此操作...谢谢

最新回復
  • 6月前
    1 #

    這是我類似完成此操作的一種方法:

    >> 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 顯示複製值組將从何處開始.這些點標有1.当對 index執行累計和時 ,我得到一个最终的索引向量,可以用来索引 v 建立異質複製值的向量。

  • 6月前
    2 #

    要添加到可能的解決方案列表中,請考虑以下一種:

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

    這比gnovice慢得多。

  • 6月前
    3 #

    您要尝試的是 run-length decode . FEX提交 rude()是高級可靠/矢量化實用程式 :

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

    結果

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

    請註意,此功能也執行相反的操作,即 run-length encodes 向量或換句话說,返迴 values 和相應的 counts

  • 6月前
    4 #

    accumarray 如果在 rep中存在零,則可以使用该函式使代碼正常工作 陣列

    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
    

  • c++:需要澄清有關getchar()和換行符的問题
  • 為什麼scanf不需要字元串的与號,並且在printf中也可以正常工作(在C語言中)?