我正在寻找一个与R中的rep
函数类似的函数用于Matlab。例如rep
我可以执行以下操作:
> rep(c(1,2,3),times=3)
[1] 1 2 3 1 2 3 1 2 3
> rep(c(1,2,3),each=3)
[1] 1 1 1 2 2 2 3 3 3
>
在matlab中有完成第一部分的repmat函数
>> repmat([1,2,3],1,3)
ans =
1 2 3 1 2 3 1 2 3
但不是第二部分(或者至少我不明白该怎么做)。
有什么建议吗?
答案 0 :(得分:12)
通过首先定义一个函数,您可以非常接近地重现R中rep函数的语法:
function [result]=rep(array, count)
matrix = repmat(array, count,1);
result = matrix(:);
然后,您可以通过使用行或列向量调用来重现所需的行为:
>> rep([1 2 3],3)
ans =
1 1 1 2 2 2 3 3 3
>> rep([1 2 3]',3)
ans =
1 2 3 1 2 3 1 2 3
注意我在第二次调用中使用了transpose(')运算符将输入数组作为列向量(3x1矩阵)传递。
我在笔记本电脑上对此进行了基准测试,并且对于重复100次的100,000个元素的基本阵列,它比使用上面的ceil选项快2到8倍,具体取决于您是想要第一个还是第二个。< / p>
答案 1 :(得分:8)
好问题+1。实现这一目标的简洁单线方法是通过Kronecker张量积,例如:
A = [1 2 3];
N = 3;
B = kron(A, ones(1, N));
然后:
B =
1 1 1 2 2 2 3 3 3
更新: @Dan提供了一个非常简洁的解决方案,看起来比我的kron
方法更有效,所以在离开页面之前检查一下答案: - )
UPDATE: @bcumming还提供了一个很好的解决方案,当输入向量很大时,该解决方案可以很好地扩展。
答案 2 :(得分:6)
如果像我一样你不知道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,然后除以3并向上舍入(即在命令行中尝试ceil((1:9)/3)
。
一些基准测试(我知道这些东西应该在循环中,所以这可能不是那么准确):
c = 1:3; n = 3;
tic; k = kron(c, ones(1, n)); toc; % 0.000208 seconds.
tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.000025 seconds.
clear;
c = 1:1000000; n = 3;
tic; k = kron(c, ones(1, n)); toc; % 0.143747 seconds.
tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.090956 seconds.
clear;
c = 1:10000; n = 1000;
tic; k = kron(c, ones(1, n)); toc; % 0.583336 seconds.
tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.237878 seconds.
答案 3 :(得分:1)
这是一个想法:
a=[1,2,3];
reshape(repmat(a,1,length(a)),1,length(a)^2)
ans =
1 2 3 1 2 3 1 2 3
reshape(repmat(a,length(a),1),1,length(a)^2)
ans =
1 1 1 2 2 2 3 3 3
我还没有找到一个更简单的功能,只需一步即可完成此操作,但如果有的话感兴趣。