楼主: half'
7821 6

[问答] R中如何生成一个新矩阵,其每个元素是原矩阵同一行中连续三个元素的连乘? [推广有奖]

  • 0关注
  • 0粉丝

高中生

50%

还不是VIP/贵宾

-

威望
0
论坛币
16 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
176 点
帖子
16
精华
0
在线时间
25 小时
注册时间
2012-8-14
最后登录
2019-2-15

楼主
half' 发表于 2015-12-8 03:11:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
RT。
有这样一个m*n的每个元素非0即1的原矩阵,现欲生成一个新m*n矩阵,前两列皆为0,第三列开始每个元素是原矩阵同一行中连续三个元素的连乘。
R中有什么函数可以简单地生成这样的新矩阵吗?求解
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何 元素

沙发
cheetahfly 在职认证  发表于 2015-12-8 09:44:30
有,我刚编的:
  1. transmat <- function(mat) {
  2.      if(!is.matrix(mat))
  3.         stop("The Argument is not a Matrix.")
  4.      nr <- nrow(mat)
  5.      nc <- ncol(mat)
  6.      mat_1 <- mat[,c(-(nc-1),-nc)]
  7.      mat_2 <- mat[,c(-1,-nc)]
  8.      mat_3 <- mat[,-1:-2]
  9.      matout <- matrix(c(rep(0,nr*2), mat_1*mat_2*mat_3), ncol = nc)
  10.      return(matout)  
  11. }
  12. # 测试:
  13. a <- matrix(sample(c(0, 1), 48, replace = T), ncol=6)
  14. b <- matrix(1:48, 6, 8)
  15. a
  16.      [,1] [,2] [,3] [,4] [,5] [,6]
  17. [1,]    0    0    0    1    0    0
  18. [2,]    0    1    1    1    0    0
  19. [3,]    1    0    1    1    1    1
  20. [4,]    0    0    1    1    1    1
  21. [5,]    0    1    0    0    0    1
  22. [6,]    0    0    0    0    1    0
  23. [7,]    1    0    0    1    0    0
  24. [8,]    1    1    0    0    0    1

  25. b
  26.      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
  27. [1,]    1    7   13   19   25   31   37   43
  28. [2,]    2    8   14   20   26   32   38   44
  29. [3,]    3    9   15   21   27   33   39   45
  30. [4,]    4   10   16   22   28   34   40   46
  31. [5,]    5   11   17   23   29   35   41   47
  32. [6,]    6   12   18   24   30   36   42   48


  33. transmat(a)
  34.      [,1] [,2] [,3] [,4] [,5] [,6]
  35. [1,]    0    0    0    0    0    0
  36. [2,]    0    0    0    1    0    0
  37. [3,]    0    0    0    0    1    1
  38. [4,]    0    0    0    0    1    1
  39. [5,]    0    0    0    0    0    0
  40. [6,]    0    0    0    0    0    0
  41. [7,]    0    0    0    0    0    0
  42. [8,]    0    0    0    0    0    0

  43. transmat(b)
  44.      [,1] [,2] [,3] [,4]  [,5]  [,6]  [,7]  [,8]
  45. [1,]    0    0   91 1729  6175 14725 28675 49321
  46. [2,]    0    0  224 2240  7280 16640 31616 53504
  47. [3,]    0    0  405 2835  8505 18711 34749 57915
  48. [4,]    0    0  640 3520  9856 20944 38080 62560
  49. [5,]    0    0  935 4301 11339 23345 41615 67445
  50. [6,]    0    0 1296 5184 12960 25920 45360 72576
复制代码


已有 2 人评分经验 论坛币 收起 理由
李会超 + 80 精彩帖子
admin_kefu + 40 热心帮助其他会员

总评分: 经验 + 80  论坛币 + 40   查看全部评分

藤椅
yywan0913 在职认证  发表于 2015-12-8 11:20:15
  1. b <- matrix(1:48, 6, 8)
  2. library(zoo)
  3. cbind(matrix(0,nc=2,nr=nrow(b)),t(apply(b,1,function(x)rollapply(x,3,prod))))
  4. ##数据太多建议data.frame(0,0,t(apply(b,1,rollapply,3,prod)))

  5.      [,1] [,2] [,3] [,4]  [,5]  [,6]  [,7]  [,8]
  6. [1,]    0    0   91 1729  6175 14725 28675 49321
  7. [2,]    0    0  224 2240  7280 16640 31616 53504
  8. [3,]    0    0  405 2835  8505 18711 34749 57915
  9. [4,]    0    0  640 3520  9856 20944 38080 62560
  10. [5,]    0    0  935 4301 11339 23345 41615 67445
  11. [6,]    0    0 1296 5184 12960 25920 45360 72576
复制代码
已有 1 人评分经验 收起 理由
李会超 + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

板凳
cheetahfly 在职认证  发表于 2015-12-8 11:39:07
yywan0913 发表于 2015-12-8 11:20
Beautiful,没想到apply和rollaply结合还有这样的效果,这应该对我也有很大帮助,多谢了!

报纸
cheetahfly 在职认证  发表于 2015-12-15 10:03:59
这几天我分别用了两种方法来分析大数据,发现我的函数速度要快很多,差距很大,有可能是apply和rollapply两个函数双重循环的缘故?测试环境是R 3.2.3,结果如下:

测评结果.png

上面是用的9*1e6矩阵,下面用1e6*9的矩阵,结果更加明显:
测评结果2.png

地板
gusu800829 发表于 2015-12-15 10:20:24
学习一下

7
zmxs2008 发表于 2016-4-1 16:41:38
学习一下,大家都好厉害

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 08:42