楼主: anchu
6370 7

[问答] R语言怎么避免矩阵里面两个for循环的使用? [推广有奖]

  • 1关注
  • 1粉丝

硕士生

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2164 点
帖子
106
精华
0
在线时间
162 小时
注册时间
2015-9-13
最后登录
2020-7-25

楼主
anchu 在职认证  发表于 2018-10-1 10:37:21 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
比如说计算矩阵中每行之间的重叠率,得到一个相似性矩阵。
代码如下,用的是两个for循环,这个代码针对小数据量没问题,一旦到大数据量,计算速度就超级慢。
所以,请大牛给出利用apply家族函数解决办法?多谢!!!

H <- matrix(sample(c(0,1),30,replace = T), 5, 6)
Sim <- matrix(0, nrow(H), nrow(H))

for(i in 1:nrow(H)){
  for(j in 1:nrow(H)){
    if(rowSums(H)[i]!=0 | rowSums(H)[j]!=0){
      Sim[i,j] <- length(intersect(which(H[i,]>0), which(H[j,]>0)))/(rowSums(H)[i]+rowSums(H)[j])
    }
  }
}


二维码

扫码加我 拉你入群

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

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

关键词:for循环 R语言 For apply 解决办法

回帖推荐

cheetahfly 发表于4楼  查看完整内容

你这个问题可以用矩阵相乘来简化。一行代码就可以了: H %*% t(H) / outer(rowSums(H), rowSums(H), "+") 不过,这种方法快是快,但很耗内存!

沙发
fdsasdfddsa 发表于 2018-10-1 12:09:46
理论上说apply使用方便,能让变得代码简洁。但本质上其实也是循环。
建议优化一下算法。比如把rowSums的结果存起来调用,避免反复计算;如果[i,j]和[j,i]是一样的话就不要算两次
另外这代码的意思是矩阵的每个元素都是0、1吗……但如果两行完全一样(含非0项)也只有0.5?
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 + 2 + 2 + 2 热心帮助其他会员
anchu + 5 + 1 + 1 + 1 精彩帖子
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 45  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
爱思考大帝 发表于 2018-10-2 01:08:05
1楼已是正解,仅作补充

1. 当前代码中,每个 nrow(H)、rowSums(H)[i] 这样的写法都是一次数据结构遍历,应使用中间变量如 row.current <- nrow(H) 一次性赋值后代入循环,就楼主的算法而言,这个性能提升应该比较明显
2. 虽然楼主要求的是行相似性,但算法中体现的是具体某个单元的数据特征,换句话说,减少嵌套并不能本质上减少你循环的总次数
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

板凳
cheetahfly 在职认证  发表于 2018-10-2 11:16:32
你这个问题可以用矩阵相乘来简化。一行代码就可以了:

H %*% t(H) / outer(rowSums(H), rowSums(H), "+")

不过,这种方法快是快,但很耗内存!
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 10 热心帮助其他会员
narcissism0923 + 4 精彩帖子
anchu + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 15  学术水平 + 5  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
anchu 在职认证  发表于 2018-10-2 21:36:15
fdsasdfddsa 发表于 2018-10-1 12:09
理论上说apply使用方便,能让变得代码简洁。但本质上其实也是循环。
建议优化一下算法。比如把rowSums的结 ...
多谢,以后写代码需要先考虑清楚,这样就简洁很多!!!

地板
anchu 在职认证  发表于 2018-10-2 21:37:21
爱思考大帝 发表于 2018-10-2 01:08
1楼已是正解,仅作补充

1. 当前代码中,每个 nrow(H)、rowSums(H) 这样的写法都是一次数据结构遍历,应使 ...
多谢!在这里学到一个经验,就是要简化代码!!!

7
anchu 在职认证  发表于 2018-10-2 21:39:09
cheetahfly 发表于 2018-10-2 11:16
你这个问题可以用矩阵相乘来简化。一行代码就可以了:

H %*% t(H) / outer(rowSums(H), rowSums(H), "+" ...
大牛,真的太神奇了!多谢,多谢!!!

8
爱思考大帝 发表于 2018-10-3 01:50:27
cheetahfly 发表于 2018-10-2 11:16
你这个问题可以用矩阵相乘来简化。一行代码就可以了:

H %*% t(H) / outer(rowSums(H), rowSums(H), "+" ...
666

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

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