如果像我一样,您不知道什么是Kronecker张量积,那么您可能会对这个更直观的解决方案感兴趣(实际上,我认为它更快):
c(ceil((1:length(c)*n)/n));
在这里,我使用向量索引来复制矩阵。例如,在上面的两个案例中,我们可以这样做:
c = 1:3;
c([1 1 1 2 2 2 3 3 3]) %for each
c([1 2 3 1 2 3 1 2 3]) %for times
所以问题是,如果没有你所要求的功能,我们如何创建一个向量[1 2 3 1 2 3 1 2 3]。因此,我创建了一个具有所需元素数量的向量,即1:9,然后将其除以三并向上取整(即在命令行中尝试
ceil((1:9)/3)
)。
一些基准测试(我知道这些东西应该在循环中完成,因此可能不太准确):
c = 1:3; n = 3;
tic; k = kron(c, ones(1, n)); toc;
tic; a = c(ceil((1:length(c)*n)/n)); toc;
clear;
c = 1:1000000; n = 3;
tic; k = kron(c, ones(1, n)); toc;
tic; a = c(ceil((1:length(c)*n)/n)); toc;
clear;
c = 1:10000; n = 1000;
tic; k = kron(c, ones(1, n)); toc;
tic; a = c(ceil((1:length(c)*n)/n)); toc;
rep
函数有each
选项;这段时间一直在用一个 hacky 的 one-liner... - bnaulrepelem
。 - Dan