楼主: 416171205
4779 13

[问答] 如何比较一个矩阵每行是不是另一个矩阵每行的子集? [推广有奖]

  • 0关注
  • 1粉丝

已卖:1052份资源

硕士生

88%

还不是VIP/贵宾

-

威望
0
论坛币
814 个
通用积分
1.0081
学术水平
7 点
热心指数
9 点
信用等级
4 点
经验
2203 点
帖子
74
精华
0
在线时间
306 小时
注册时间
2008-11-4
最后登录
2023-2-25

楼主
416171205 发表于 2012-12-28 10:39:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问如何比较一个矩阵每行是不是另一个矩阵每行的子集?

比如:
A=
1 2
3 4
5 6
B=
2 4 5 6
3 2 4 6
A的第一行即不是B第一行的子集也不是B第二行的子集,因此返回False.
A的第2行不是B第一行的子集,但是B第二行的子集,因此返回TRUE.
A的第3行是B第一行的子集,但不是B第二行的子集,因此返回TRUE.
我的CODE;
      for (m in 1:dim(B)[1]){
        apply(A,1,function(x) ifelse(all(x%in%B[m,]),TRUE,FALSE))
      }

想请问能否去掉这个循环,因为我实际的AB都很大,循环会比较慢,谢谢!
二维码

扫码加我 拉你入群

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

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

关键词:function apply appl else code 矩阵 如何

沙发
qoiqpwqr 发表于 2012-12-28 11:20:31
这个似乎只能用循环
已有 1 人评分学术水平 热心指数 收起 理由
416171205 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
416171205 发表于 2013-1-2 09:20:40
qoiqpwqr 发表于 2012-12-28 11:20
这个似乎只能用循环
好的,谢谢了

板凳
jmpamao 发表于 2013-1-5 17:12:41
for (m in 1:dim(B)[1]){
        apply(A,1,function(x) ifelse(all(x%in%B[m,]),TRUE,FALSE))
      }

这个循环 觉得有问题,比如说 A[3,]在 B[1,] 为 T, 但是 A[3,]在 B[2,]为F
按照你的意思, A[3,] 在B 中 为T, 但是如果循环到了最后,会返回B[2,]为 F.没有控制住循环 break

报纸
jmpamao 发表于 2013-1-5 17:47:54
apply(),我用的不熟,不是很理解数据怎么运算的, 特别是  apply 处理 array时,
array:
a:
,,1
#matrix
,,2
#matrix
,,3
#maatrix
apply(a,1,mean), 搞不明白,到底怎么运算的? help

地板
qoiqpwqr 发表于 2013-1-5 22:56:44
jmpamao 发表于 2013-1-5 17:47
apply(),我用的不熟,不是很理解数据怎么运算的, 特别是  apply 处理 array时,
array:
a:
最简单的方法就是弄一个3维的array,然后画个三维立体图,看看里面的数字是怎么排列的。

> a <- array(1:24, c(2,3,4))
> a
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

你可以画一个三维的2x3x4的长方体,然后把这些数字填进去看看是怎么放的。然后array(a, 1, mean)就很清楚了。记住一点,array得到的结果总是和apply所在的方向上的维数是相同的。

> apply(a, 1, mean) #因为1方向上长度是2
[1] 12 13
> apply(a, c(1, 2), mean) # 因为1和2方向上的长度分别是2和3
     [,1] [,2] [,3]
[1,]   10   12   14
[2,]   11   13   15

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 太感谢了。

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

7
jmpamao 发表于 2013-1-5 23:03:13
n  <- array(rnorm(2^3),dim=c(2,2,2))
#每一维第一行,求和
apply(n,1,sum)[1]
##或者
sum(n[,,1][1,]+n[,,2][1,])

#把每一维第一行的数据 提取出来
c(n[,,1][1,],n[,,2][1,])
##或者
ab<-c()
for(i in 1:2){
abc <-n[,,i][1,]
ab <-c(ab,abc)
}
ab

问题是如果 维数 很大时,比如dim=c(10,10,10)时,
sum(n[,,1][1,]....+n[,,10][1,]) 怎么样化简#不用apply...不用循环
n[,,1:10]
又如何提取出每维的 第一行
n[,,1:10][1,]#此错误.

8
jmpamao 发表于 2013-1-5 23:59:37
qoiqpwqr 发表于 2013-1-5 22:56
最简单的方法就是弄一个3维的array,然后画个三维立体图,看看里面的数字是怎么排列的。

> a  a
太感谢了,3维图可以很方便理解。
1或者2,通过 经过1或者2的面 来囊括所有的元素,需要几个面,就得到什么样的长度

而c(1,2),是1的面 和 2的面 交叉,投影到一个面,而得到的一组数据

但是感觉,缺少 3,就是 这个面平行于xy,也是可以囊括所有的元素,apply(a,3,mean)

9
jmpamao 发表于 2013-1-6 00:02:21
apply(a,3,mean) 看了下 也是可以的额 呵呵
那也应该可以 apply(a,c(2,3),mean), apply(a,c(1,3),mean)

10
qoiqpwqr 发表于 2013-1-6 00:21:53
jmpamao 发表于 2013-1-6 00:02
apply(a,3,mean) 看了下 也是可以的额 呵呵
那也应该可以 apply(a,c(2,3),mean), apply(a,c(1,3),mean)
都可以的

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

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