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