首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个与Matlab中的R's rep类似的函数

一个与Matlab中的R's rep类似的函数
EN

Stack Overflow用户
提问于 2013-01-31 06:43:09
回答 3查看 16.6K关注 0票数 21

我正在寻找一个函数,它的行为类似于Matlab的R中的rep函数。例如,使用rep,我可以执行以下操作:

代码语言:javascript
运行
复制
> 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函数,它完成了第一部分。

代码语言:javascript
运行
复制
>> repmat([1,2,3],1,3)

ans =

     1     2     3     1     2     3     1     2     3

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

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-31 21:02:11

通过首先定义如下函数,您可以非常接近地在R中重现rep函数的语法:

代码语言:javascript
运行
复制
function [result]=rep(array, count)
matrix = repmat(array, count,1);
result = matrix(:);

然后,您可以通过使用行向量或列向量调用来重现所需的行为:

代码语言:javascript
运行
复制
>> 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,000个元素的基础阵列重复100次,它比使用上面的ceil选项快2到8倍,这取决于您想要第一种排列还是第二种排列。

票数 12
EN

Stack Overflow用户

发布于 2013-01-31 14:50:51

如果你像我一样不知道什么是Kronecker张量积,你可能会对这个更直观(实际上我认为更快)的解决方案感兴趣:

代码语言:javascript
运行
复制
c(ceil((1:length(c)*n)/n));

所以这里我使用向量索引来复制矩阵。例如,使用上面的两种情况,我们可以这样做:

代码语言:javascript
运行
复制
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) )。

一些基准测试(我知道这个东西应该是循环的,所以这可能不是很准确):

代码语言:javascript
运行
复制
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.
票数 6
EN

Stack Overflow用户

发布于 2013-01-31 06:53:01

这里有一个想法:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14615305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档