Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似于R';Matlab中的s-rep_R_Matlab - Fatal编程技术网

类似于R';Matlab中的s-rep

类似于R';Matlab中的s-rep,r,matlab,R,Matlab,我正在寻找一个与R for Matlab中的rep函数类似的函数。例如,使用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

我正在寻找一个与R for Matlab中的
rep
函数类似的函数。例如,使用
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
但不是第二部分(或者至少我不知道怎么做)

有什么建议吗?

这里有一个想法:

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

我还找不到一个简单的函数可以一步完成这项工作,但如果有,我会感兴趣。

好问题+1。通过Kronecker张量积实现这一点的简单单线性方法,例如:

A = [1 2 3];
N = 3;
B = kron(A, ones(1, N));
然后:

更新:@Dan提供了一个非常简洁的解决方案,看起来比我的
kron
方法更有效,所以在离开页面之前检查答案:-)


更新:@bcumming还提供了一个很好的解决方案,当输入向量较大时,该解决方案可以很好地扩展。

如果像我一样,你不知道什么是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
所以问题是,如果没有你所要求的功能,我们怎么做一个向量[123123123]。因此,我用我们需要的元素数做了一个向量,即1:9,然后除以3,然后取整(即在命令行中尝试
ceil((1:9)/3)

一点基准测试(我知道这东西应该在循环中,所以可能这不太准确):


首先定义一个函数,如下所示,可以相当接近地重现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
注意,我在第二次调用中使用了转置(')操作符,将输入数组作为列向量(3x1矩阵)传递


我在笔记本电脑上对此进行了基准测试,对于100000个元素重复100次的基本阵列,它比使用上面的ceil选项快2到8倍,这取决于您是想要第一种排列还是第二种排列。

有一个简单的一步函数:
kron
(Kronecker张量积)。我已经添加了一个示例。干杯。我试图想出一个我能理解的解决方案,因为我不知道什么是Kronecker张量积。你可能对结果感兴趣,我认为它比kron()快虽然我还没有真正做过适当的基准测试…不敢相信我不知道
rep
每个
选项;一直以来都在使用一个粗糙的单行程序…请注意,自Matlab2015a以来,现在有一个内置函数正是这样做的:非常整洁+1!我在我的机器上验证了您的速度测试,并添加了一些循环,一个你得到的结果很有代表性。通常,我发现你的方法比
kron
快4倍。但是更直观?我认为这是旁观者的看法:-)Kronecker产品在概念上非常简单,一旦一个人经历了计算它们如何工作的初始成本…是的,很公平-我猜它只是名字,它里面有一个词张量,因此它吓到了我:)在我的小例子中它肯定有效,但我想要一些真正适用于“不规则”向量的东西。例如,像c=[1.34,9.2,-8.2,99]这样的向量适用于任何向量,甚至文本。它对你评论中的向量绝对有效。它甚至会在这方面起作用:n=3;c=‘哇!’;c(ceil((1:length(c)*n)/n))快速简单!我很惊讶雷普马特是赢家,但在这种情况下,它显然是最好的解决方案!如果有效地实现,repmat应该非常快,因为它通过将内存从一个位置复制到另一个位置来执行重复。具有大量缓存的现代处理器在这方面非常擅长。这也是两种使用类型之间存在4个速度差异的原因:速度快的一种具有跨步1内存访问,而另一种具有跨步长度(数组)内存访问,速度较慢。
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