在MATLAB中生成具有特定重复元素的数组

时间:2015-10-21 05:10:15

标签: arrays matlab vectorization run-length-encoding

我有一个数组,例如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?

谢谢!

4 个答案:

答案 0 :(得分:3)

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

cin>>a>>b;
c>>d;

答案 1 :(得分:2)

怎么样......

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

答案 2 :(得分:0)

我认为@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])因为输入已经几乎按顺序排列。

答案 3 :(得分:0)

遵循与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