matlab如何生成具有复制递增数的向量

matlab如何生成具有复制递增数的向量,matlab,matrix,Matlab,Matrix,在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],然后复制到M行(repmat),然后按列读取(重塑) 通常更快的替代方法是用矩阵积替换repmat,并通过线性索引重塑(感谢@Dan和@Floris): 另请参见@Dan的答案

在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]
,然后复制到
M
行(
repmat
),然后按列读取(
重塑

通常更快的替代方法是用矩阵积替换
repmat
,并通过线性索引重塑
(感谢@Dan和@Floris):

另请参见@Dan的答案,根据版本/机器的不同,它可能会更快,或者@Dennis的答案,它可能是最快的

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

我认为使用kronecker产品可能会更快,但也可能不会。请参见

鉴于向量的简单结构,有一个非常简单的解决方案:

ceil((1:24)/6)
对于小矢量非常快,对于大矢量非常有竞争力。当矢量变得非常大时,
重塑
替代方案具有更好的速度

当然,它可以很容易地概括为:

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

很好的解决方案。但至于速度,我的机器似乎需要两倍的速度。。。(R2010b,Win Vista)@LuisMendo有趣的是,对我来说,
kron
的倍频程速度是Matlab的10倍,但速度只有Matlab的一半。使用
(:)'
而不是
重塑
在Matlab中的速度更快。在我的两个例子中都是最快的。我不认为速度与这么小的向量有关。@Marclaesen实际上,重复的次数在OP中没有指定,所以可能不是tiny@Dan这就是我的观点。在如此小的向量上计时毫无意义。您所看到的是,这种方法的开销略低于其他方法。一旦转到大向量,这就变得完全不相关了。这样的计时是无用的。@Marclaesen我同意小样本的计时没有那么重要,但是我建议这种方法主要是为了方便使用。因此,我希望没有更高的速度不是否决此解决方案的理由。重塑比
myMatrix(:)'
慢。因此,分两行执行,速度更快……尽管它有更多的开销,但重塑解决方案在大向量方面的性能优于其他解决方案。在
M=60000
N=40000
时,
kron
解决方案内存不足,其他解决方案需要2分钟,而
重塑
解决方案在7秒内完成。信息不足,无法唯一地提出有效解决方案。
N = 4;
M = 6;
ceil((1:M*N)/M)