为了账号安全,请及时绑定邮箱和手机立即绑定

与Mat的R代表类似的函数

/ 猿问

与Mat的R代表类似的函数

呼啦一阵风 2019-08-28 14:18:16

与Mat的R代表类似的函数

我正在寻找一个rep与Matlab中R函数类似的函数。例如,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

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

有什么建议?


查看完整描述

3 回答

?
慕勒3428872

您可以通过首先定义一个函数,如下所示,在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倍,具体取决于您是否需要第一个或第二个排列。


查看完整回答
反对 回复 2019-08-28
?
浮云间

好问题+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还提供了一个很好的解决方案,当输入向量很大时,它应该非常好地扩展。


查看完整回答
反对 回复 2019-08-28
?
临摹微笑

如果像我一样你不知道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.


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 92 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信