我有一个数组,例如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?
谢谢!
答案 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 solution
到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