在MATLAB中产生一个向量,如何产生这样的载体:MATLAB如何与复制越来越多
[1,1,1,...,1,1, 2,2,2,...,2,2, 3,3,3,...,3,3, 4,4,4,...,4,4]
在MATLAB中产生一个向量,如何产生这样的载体:MATLAB如何与复制越来越多
[1,1,1,...,1,1, 2,2,2,...,2,2, 3,3,3,...,3,3, 4,4,4,...,4,4]
您可以使用:
N = 4;
M = 6;
result = reshape(repmat(1:N,M,1),1,[])
这是通过生成[1,2,3,...,N]
,然后复制(repmat
),然后按列读取(reshape
)。
甲通常更快的选择是通过线性索引来代替通过矩阵积repmat
和reshape
(感谢@丹和@Floris):
result = ones(M,1)*(1:N);
result = result(:).'
另见@丹的答案,这可能会更快取决于版本/机器,或@丹尼斯,这可能是最快的。
重塑比'myMatrix(:)''慢。因此,请分两行,速度更快...... – Floris
虽然它有更多开销,但重构解决方案的性能优于大型向量。在'M = 60000'和'N = 40000'时,'kron'解决方案在内存中出现故障,其他解决方案需要2分钟,“重塑”解决方案在7秒内完成。 –
kron(1:4, ones(1,6))
我认为使用克罗内克尔产品可能会更快,但它也可能不会。见A similar function to R's rep in Matlab
很好的解决方案。但是对于速度来说,我的机器似乎要花费两倍的时间...(R2010b,Win Vista) –
@LuisMendo有趣的是,对于我来说'kron'在Octave中快了10倍,而在Matlab中速度却只有它的一半。在Matlab中使用'(:)''而不是'reshape'更快。 – Dan
鉴于您的载体的结构简单,一个很简单的解决方案可供选择:
ceil((1:24)/6)
非常快的小载体,和路数的竞争力。当矢量变得非常大时,reshape
替代品具有更好的速度。
当然,它很容易被概括:
N = 4;
M = 6;
ceil((1:M*N)/M)
没有足够的信息来唯一提出有效的解决方案。 – Oleg