楼主: xl0418
2407 10

[问答] 求助R能否实现这样的智能构建矩阵 [推广有奖]

  • 0关注
  • 0粉丝

已卖:159份资源

大专生

31%

还不是VIP/贵宾

-

威望
0
论坛币
1698 个
通用积分
0.2250
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1262 点
帖子
38
精华
0
在线时间
48 小时
注册时间
2008-10-19
最后登录
2017-6-15

楼主
xl0418 发表于 2015-12-10 19:52:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
目前想用这样的方法构建矩阵,设定总数N, 分配到三个位置  如“——,——,——”,每个位置的数大于等于0,总和小于等于N. 然后按照第一个位置优先级最高,从小到大排列,第二位置优先级次要,从小到大排列,第三位置优先级最低,从小到大排列。形成方阵(行列都按照这个顺序排列),并且每行每列的名字能用这样的向量当做名字。

不知道说清楚了没,比如设定N=2, 则三个数的和小于等于2(大于等于0)这样的排列总共有10个,然后按照这样的顺序排列:
000,001,002,010,011,020,100,101,110,200.  并构成10*10的矩阵,行列都用这个排列形成的类似于(0,1,0)的向量取名。(因下一步还的用这个向量名字来给矩阵赋值)

不知道R能否实现。谢谢大神们了。
二维码

扫码加我 拉你入群

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

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

关键词:从小到大 优先级 不知道 下一步 智能

沙发
suimong 发表于 2015-12-11 13:58:40
不知道这样是否满足你的要求?
  1. CreateMatrix <- function (N) {
  2.   sol <- expand.grid(0:N,0:N,0:N)
  3.   sol <- cbind(sol, sum=apply(sol,1,sum))
  4.   
  5.   sol <- sol[sol$sum<=N,1:3]
  6.   sol <- sol[order(sol[,1],sol[,2],sol[,3]),]
  7.   nm <- paste("(",sol[,1],",",sol[,2],",",sol[,3],")", sep = "")
  8.   out <- matrix(nrow = nrow(sol), ncol = nrow(sol))
  9.   dimnames(out) <- list(nm,nm)
  10.   out
  11. }

  12. CreateMatrix(2)
复制代码
已有 1 人评分经验 收起 理由
李会超 + 40 热心帮助其他会员

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

藤椅
xl0418 发表于 2015-12-11 17:36:29
suimong 发表于 2015-12-11 13:58
不知道这样是否满足你的要求?
非常感谢,我正在查看结果。

板凳
xl0418 发表于 2015-12-11 17:50:26
suimong 发表于 2015-12-11 13:58
不知道这样是否满足你的要求?
  1. > CreateMatrix <- function (N){
 sol <- expand.grid(0:N,0:N,0:N)
 sol <- cbind(sol, sum=apply(sol,1,sum))
 sol <- sol[sol$sum<=N,1:3]
  2. Error: unexpected input in "CreateMatrix <- function (N){猗
  3. >      sol <- sol[order(sol[,1],sol[,2],sol[,3]),] 
 nm <- paste("(",sol[,1],",",sol[,2],",",sol[,3],")", sep = "")
out <- matrix(nrow = nrow(sol), ncol = nrow(sol))
dimnames(out) <- list(nm,nm)
 out
}
  4. Error: unexpected input in "     sol <- sol[order(sol[,1],sol[,2],sol[,3]),] 猗
  5. > CreateMatrix(2)
  6. Error: could not find function "CreateMatrix"
复制代码

有错误,不过我逐行调试都没问题,我再检查下,非常感谢您。

报纸
suimong 发表于 2015-12-12 17:40:36
xl0418 发表于 2015-12-11 17:50
有错误,不过我逐行调试都没问题,我再检查下,非常感谢您。
看看是不是复制代码的时候出了问题,检查一下空格换行符什么的。

地板
xl0418 发表于 2015-12-14 17:07:54
suimong 发表于 2015-12-12 17:40
看看是不是复制代码的时候出了问题,检查一下空格换行符什么的。
非常感谢,已经解决了。估计就是代码复制的问题。另请问下,可以通过比较行列名字来对矩阵赋值么?比如现在这个矩阵每行每列的名字都是一个向量,通过比较矩阵元素的行列名字,比如行数为(0,0,0)第三个分量加1变为(0,0,1)恰好是列数,就把该元素赋值5这样。

7
suimong 发表于 2015-12-15 00:20:01
xl0418 发表于 2015-12-14 17:07
非常感谢,已经解决了。估计就是代码复制的问题。另请问下,可以通过比较行列名字来对矩阵赋值么?比如现 ...
不是很明白你的意思,这个5和(0,0,0),(0,0,1)之间的关系是什么呢?

8
xl0418 发表于 2015-12-15 18:39:53
suimong 发表于 2015-12-15 00:20
不是很明白你的意思,这个5和(0,0,0),(0,0,1)之间的关系是什么呢?
现在这个矩阵建立起来了,其中每个元素的行列有有类似这个组合的名字(如行(0,0,1),列(0,1,0))。现在初始赋值都是0,然后我想根据比较行列名字来对矩阵赋值。例如 out["(0,0,1)","(0,0,1)"]这个元素(也就是第一行第一列元素)本来是0,现在我发现他们行列名字相等(但现在这些名字是字符串,不是向量,所以不能直接比较。),所以赋值1,再比如,out["(1,0,0)","(0,0,1)"],通过比较行列名字,赋值3.这样。我现在想到的办法是,用strsplit分开行列名字里的数字,然后数值化,在比较每个分量来进行赋值。不知道还有其他简单方法不。

9
suimong 发表于 2015-12-16 02:07:33
xl0418 发表于 2015-12-15 18:39
现在这个矩阵建立起来了,其中每个元素的行列有有类似这个组合的名字(如行(0,0,1),列(0,1,0)) ...
我理解你是希望通过给元素的行列名设定一系列的规则,对于符合规则的元素赋特定的值?进一步说,这些规则规定的是行列名中的两个向量的数值关系是吧?如果是这样的话,你直接在CreateMatrix函数体里用sol进行处理就可以了。sol的第i行就是out的第i行的行名里的那三个数值分量。如果你能把具体的规则写出来的话我或许可以更好地帮你。

10
xl0418 发表于 2015-12-16 17:16:51
suimong 发表于 2015-12-16 02:07
我理解你是希望通过给元素的行列名设定一系列的规则,对于符合规则的元素赋特定的值?进一步说,这些规则 ...
真的非常感谢你哈,已经解决了,虽然不知道是不是最优的程序。我的想法就是你理解的,通过比较元素的行列名字(也就是那两个向量)来给元素赋值。在我编程的时候我发现这两个向量的数据类型其实是character,所以不能直接进行比较运算,后来我把向量分开,然后转化为数值在进行的比较运算就行了。不知道能不能直接让行列名字就是数值(向量)的?这样就不用转换了。

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

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