21

我正在寻找一个行为类似于repR for 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

但不是第二部分(或者至少我不知道该怎么做)。

有什么建议么?

4

4 回答 4

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

注意我在第二次调用中使用了转置 (') 运算符将输入数组作为列向量(3x1 矩阵)传递。

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

于 2013-01-31T13:02:10.823 回答
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方法更有效,所以在离开页面之前检查答案:-)

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

于 2013-01-30T23:03:37.310 回答
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,然后除以三并向上取整(即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.
于 2013-01-31T06:50:50.680 回答
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

我还没有找到一个更简单的功能,可以一步完成,如果有的话感兴趣。

于 2013-01-30T22:53:00.787 回答