楼主: zhou1_20
3629 6

[问答] 用R实现下面这个有趣的编程,看谁方法多,谁方法好 [推广有奖]

已卖:689份资源

副教授

20%

还不是VIP/贵宾

-

威望
0
论坛币
18999 个
通用积分
1029.7754
学术水平
146 点
热心指数
166 点
信用等级
135 点
经验
36357 点
帖子
541
精华
0
在线时间
887 小时
注册时间
2015-9-25
最后登录
2025-12-4

楼主
zhou1_20 发表于 2016-3-31 23:13:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
用R实现下面这个有趣的编程,看谁方法多,谁方法好
二维码

扫码加我 拉你入群

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

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

关键词:R实现

QQ图片20160331230927.png (22.71 KB)

QQ图片20160331230927.png

QQ图片20160331230927.png (22.71 KB)

QQ图片20160331230927.png

沙发
cheetahfly 在职认证  发表于 2016-4-1 10:43:11
我先来抛砖吧,
设对应的未知数是x11,x12,x21,x22,x23,x31,x32,x33,各自与行列的位置对应,条件方程有六个,分别对应三行与三列,如果用穷举法,大概的组合有21^8之多,大约300多亿,非常耗时。不过,幸好这些条件方程是相互联系的,因此,可以用替换法来缩减,每一个条件方程式缩减一个变量,最终可以用5个条件方程缩减5个变量,变成下面的等式:

x22*x32-(4+x22*(9-x31-x32))/x31=5

保留下来需要穷举的变量只有三个,循环量大概21^2*20,约8000多个,这么少的循环,即便是R语言,都表示毫无压力。代码如下:

  1. result <- matrix(ncol = 8)
  2. colnames(result) <- c("x11", "x12", "x21", "x22", "x23", "x31", "x32", "x33")
  3. for (x22 in 0:20) {
  4.   for (x31 in 1:20) {
  5.     for (x32 in 0:20) {
  6.           if(x22*x32-(4+x22*(9-x31-x32))/x31==5)
  7.             result <- rbind(result, c(9-x22*x32,13+x22*x32-9,4+x22*(9-x31-x32),x22,9-x32-x31,x31,x32,x31+x32-4))
  8.           else next
  9.         }
  10.   }
  11. }
复制代码
结果出来后,还需要把NA值和其他变量不符合0-20条件的行去除,
  1. result <- result[-1,]    #去除第一列空值
  2. result <- result[apply(result,1,min)>=0,]
  3. result
  4. x11 x12 x21 x22 x23 x31 x32 x33
  5.   2  11   4   1   0   2   7   5
复制代码
整个过程在R上的运行速度非常快,在我的i3电脑上都只需要大概11毫秒,因此,我也懒得再去优化了。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
李会超 + 80 + 40 精彩帖子
zhou1_20 + 5 + 1 + 1 + 1 精彩帖子

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

藤椅
zhou1_20 发表于 2016-4-1 16:44:07 来自手机
cheetahfly 发表于 2016-4-1 10:43
我先来抛砖吧,
设对应的未知数是x11,x12,x21,x22,x23,x31,x32,x33,各自与行列的位置对应,条件方程有六个 ...
厉害?

板凳
jiangbeilu 学生认证  发表于 2016-4-2 10:30:46
  1. # 可以判断出一些范围
  2. x11 <- 0:3
  3. x22 <- 0:20
  4. x23 <- 0:5
  5. alltypes <- expand.grid(x11,x22,x23)
  6. # 已知3个数
  7. x11 <- alltypes[,1]
  8. x22 <- alltypes[,2]
  9. x23 <- alltypes[,3]

  10. x12 = 13 - x11
  11. x33 = 5 - x23
  12. x21 = x22 * x23 +4
  13. x31 = x21 / (4- x11)
  14. x32 = (x12 -4)/x22

  15. zz <- cbind(x11,x12,x21,x22,x23,x31,x32,x33)
  16. # 判断0-20间的整数
  17. index <- apply(zz,2,function(x) x%%1==0&x>=0&x<=20)
  18. # 返回结果
  19. zz[which(apply(index,1,sum)==8),]
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
zhou1_20 + 5 + 1 + 1 + 1 精彩帖子

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

报纸
cometwx 发表于 2016-4-4 16:12:07
非常有趣

地板
wuliea 学生认证  发表于 2019-4-8 10:50:02
楼主什么垃圾水平,for循环用个不停,一看就是初学者。什么素质,还好意思来我帖子下灌水,公开我代码?

7
zhou1_20 发表于 2019-4-8 12:25:00 来自手机
wuliea 发表于 2019-4-8 10:50
楼主什么垃圾水平,for循环用个不停,一看就是初学者。什么素质,还好意思来我帖子下灌水,公开我代码?
哪个for循环代码是我编写的?我要论坛币了吗?

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

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