【问题标题】:Generate an array with specific duplicate elements in MATLAB在 MATLAB 中生成具有特定重复元素的数组
【发布时间】:2015-10-21 05:10:14
【问题描述】:

我有一个数组,例如 B = [2,5,7],还有一个数 C = 10,其中 C 总是大于或等于 B 中的最大数。 我想根据B和C生成一个数组A。在这个具体的例子中,我有

A = [1, 2, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 7, 8, 9, 10]

也就是说,我生成了一个数组 [1:C],但是 B 中的每个元素都重复了 3 次。有什么不使用for循环生成数组A的好方法吗?

谢谢!

【问题讨论】:

  • A 是否无限长?
  • A的最大个数是固定的。例如,10.

标签: arrays matlab vectorization run-length-encoding


【解决方案1】:

您可以使用repelem(Matlab R2015a 中引入):

B = [2 5 7]
C = 10;
n = 3;

r = ones(1,C);
r(B) = n;
A = repelem(1:C, r)

【讨论】:

    【解决方案2】:

    怎么样...

    B = [2,5,7];
    C = 10;
    A = sort([1:C,B,B])
    

    【讨论】:

    • 总的来说,我喜欢它。主要缺点是调用排序函数,这可能很耗时。我等待是否有更好的答案。谢谢。
    • Luis Mendo 的答案也不错,但我没有 Matlab 2015。我接受这个答案,因为它简单且不易出错。
    【解决方案3】:

    我认为@RPM 的答案可能会更快。但是因为您特别要求没有排序的解决方案:

    B = [2,5,7];
    C = 10;
    D = setdiff(1:C,B)-1;
    
    A = reshape(repmat(1:C,3,1),1,3*C);
    A([3*D+1,3*D+2]) = [];
    

    这也将返回正确的结果。我不确定setdiff() 的顺序。在所有情况下,它都可能比sort() 更糟。特别是与 A = sort([1:C,B,B]) 因为输入已经差不多了。

    【讨论】:

    • @RPM 的解决方案比这快 2 个数量级。
    • 很高兴知道,谢谢。这也是为什么我赞成他的回答。但是,如果任务颠倒过来,不在B 中的数字应该增加三倍,这应该是避免sort() 的合理解决方案,因为也可以摆脱setdiff()
    【解决方案4】:

    遵循与this solutionRepeat copies of array elements: Run-length decoding in MATLAB 相同的理念,你可以在这里做类似的事情,像这样-

    %// Get increment array (increments used after each index being repeated in B) 
    inc = zeros(1,C);
    inc(B+1) = N-1
    
    %// Calculate ID array (places in output array where shifts occur)
    id = zeros(1,C+(N-1)*numel(B));
    id(cumsum(inc) + (1:C)) = 1
    
    %// Finally get cumulative summation for final output 
    A = cumsum(id)
    

    示例运行 -

    B =
         2     5     7
    C =
        10
    N =
         3
    inc =
         0     0     2     0     0     2     0     2     0     0
    id =
         1     1     0     0     1     1     1     0     0     1     1     0     0     1     1     1
    A =
         1     2     2     2     3     4     5     5     5     6     7     7     7     8     9    10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2013-03-09
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多