2013-10-23 45 views
-2

在MATLAB中产生一个向量,如何产生这样的载体:MATLAB如何与复制越来越多

[1,1,1,...,1,1, 2,2,2,...,2,2, 3,3,3,...,3,3, 4,4,4,...,4,4] 
+0

没有足够的信息来唯一提出有效的解决方案。 – Oleg

回答

4

您可以使用:

N = 4; 
M = 6; 
result = reshape(repmat(1:N,M,1),1,[]) 

这是通过生成[1,2,3,...,N],然后复制(repmat),然后按列读取(reshape)。

甲通常更快的选择是通过线性索引来代替通过矩阵积repmatreshape(感谢@丹和@Floris):

result = ones(M,1)*(1:N); 
result = result(:).' 

另见@丹的答案,这可能会更快取决于版本/机器,或@丹尼斯,这可能是最快的。

+1

重塑比'myMatrix(:)''慢。因此,请分两行,速度更快...... – Floris

+1

虽然它有更多开销,但重构解决方案的性能优于大型向量。在'M = 60000'和'N = 40000'时,'kron'解决方案在内存中出现故障,其他解决方案需要2分钟,“重塑”解决方案在7秒内完成。 –

4
kron(1:4, ones(1,6)) 

我认为使用克罗内克尔产品可能会更快,但它也可能不会。见A similar function to R's rep in Matlab

+0

很好的解决方案。但是对于速度来说,我的机器似乎要花费两倍的时间...(R2010b,Win Vista) –

+1

@LuisMendo有趣的是,对于我来说'kron'在Octave中快了10倍,而在Matlab中速度却只有它的一半。在Matlab中使用'(:)''而不是'reshape'更快。 – Dan

5

鉴于您的载体的结构简单,一个很简单的解决方案可供选择:

ceil((1:24)/6) 

非常快的小载体,和路数的竞争力。当矢量变得非常大时,reshape替代品具有更好的速度。

当然,它很容易被概括:

N = 4; 
M = 6; 
ceil((1:M*N)/M) 
+0

+1这是我的机器上最快的 –

+1

最快的也是我的 – Dan

+0

我不认为*速度*是这样一个小矢量的关注。 –