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

Generate an array with specific duplicate elements in MATLAB

我有一个数组,例如 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的好方法吗?

谢谢!

怎么样...

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

我认为@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]) = [];

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

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

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

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

遵循与 this solution to Repeat 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