我有一个数组,例如 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的好方法吗?
谢谢!
我有一个数组,例如 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的好方法吗?
谢谢!
您可以使用repelem
(在 Matlab R2015a 中引入):
B = [2 5 7]
C = 10;
n = 3;
r = ones(1,C);
r(B) = n;
A = repelem(1:C, r)
怎么样...
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]) = [];
这也将返回正确的结果。我不确定订单setdiff()
有没有。它可能比sort()
所有情况都更糟。尤其是
A = sort([1:C,B,B])
输入已经几乎是有序的。
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