3

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

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

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

谢谢!

4

4 回答 4

3

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

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

r = ones(1,C);
r(B) = n;
A = repelem(1:C, r)
于 2015-10-21T10:12:54.567 回答
2

怎么样...

B = [2,5,7];
C = 10;
A = sort([1:C,B,B])
于 2015-10-21T06:14:18.413 回答
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])输入已经几乎是有序的。

于 2015-10-21T07:55:22.703 回答
0

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
于 2015-10-21T19:41:42.027 回答