找回密码
 注册
Simdroid-非首页
查看: 177|回复: 12

[数值计算] 如何从中提取这样的数组?

[复制链接]
发表于 2012-9-28 22:00:18 | 显示全部楼层 |阅读模式 来自 上海
我有一组数,这里给出一个简单示例,比如A = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};能否给出一个算法得到这样的数据:A[]中任意三个数在所有行中只出现过一次,得到i值,得到这三个数。比如上面的A,i=1,这三个数有{1,2,3},{1,2,4},{1,3,4}在所有行中只出现过一次,同样得到i=2,这三个数有{2,3,5},{2,4,5},还有i=3,这三个数为{3,4,6},{3,5,6},{4,5,6}.
这个A数组是个i*4的数列,i = Length[A],A[]里面有四个数,这四个数都是整数,没有规律,随机排列的,比如可能等于{2100,59,10,1095}等等了,这四个数绝不会出现有相同的数字,A里面的数是从1到某一个数比如1000毫无规律分布到里面的。
 楼主| 发表于 2012-9-28 22:01:10 | 显示全部楼层 来自 上海
Simdroid开发平台
我有一组数,这里给出一个简单示例,比如A = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};能否给出一个算法得到这样的数据:A[[i]]中任意三个数在所有行中只出现过一次,得到i值,得到这三个数。比如上面的A,i=1,这三个数有{1,2,3},{1,2,4},{1,3,4}在所有行中只出现过一次,同样得到i=2,这三个数有{2,3,5},{2,4,5},还有i=3,这三个数为{3,4,6},{3,5,6},{4,5,6}.
这个A数组是个i*4的数列,i = Length[A],A[[i]]里面有四个数,这四个数都是整数,没有规律,随机排列的,比如可能等于{2100,59,10,1095}等等了,这四个数绝不会出现有相同的数字,A里面的数是从1到某一个数比如1000毫无规律分布到里面的。
回复 不支持

使用道具 举报

发表于 2012-9-29 13:20:03 | 显示全部楼层 来自 安徽芜湖
小辈愚钝,看了好久都没明白楼主的意思.
回复 不支持

使用道具 举报

 楼主| 发表于 2012-9-29 14:59:45 | 显示全部楼层 来自 上海
gotit 发表于 2012-9-29 13:20
小辈愚钝,看了好久都没明白楼主的意思.

就是每行是否存在三个数,这三个数只出现一次,就是除自己以外的行中都没有出现过。比如{3,4,5}在第二行中和第三行中出现过就不算了,{2,3,4}在第一行和第二行数字中出现过。其余的都是在各自的行中出现过一次
回复 不支持

使用道具 举报

 楼主| 发表于 2012-9-29 15:13:02 | 显示全部楼层 来自 上海
我是编了一段程序,但是效率不是很高,我想看看是否有人能想出更好的办法来,因为我实际用的话,这里的aa数组是一个极为庞大的数Length[aa]可能达到几千上万甚至十万百万的规模,我这里算一个Length[aa]等于1500左右的数组就算了大概20秒,我希望能算的更快
aa = {{1, 3, 2, 4}, {4, 5, 3, 2}, {4, 5, 6, 3}};
B = Table[0, {i, Length[aa]}];
For[i = 1, i <= Length[aa], i++, B[[i]] = Sort[aa[[i]]]];
B1 = Table[0, {i, Length[aa]}];
Do[B1[[i]] = {{B[[i, 1]], B[[i, 2]], B[[i, 3]]}, {B[[i, 1]],
     B[[i, 2]], B[[i, 4]]}, {B[[i, 1]], B[[i, 3]],
     B[[i, 4]]}, {B[[i, 2]], B[[i, 3]], B[[i, 4]]}}, {i, 1,
   Length[aa]}];
c = Flatten[B1, 1];
f = Reap@Do[
    If[Length[Position[c, c[[i]]]] == 1, Sow[i]], {i, 1, Length[c]}];
dd = f[[2, 1]];
nub = Ceiling[dd/4];
El = {};
Do[El = Append[El, c[[dd[[i]]]]], {i, 1, Length[dd]}];
nub
El
回复 不支持

使用道具 举报

发表于 2012-9-29 19:57:43 | 显示全部楼层 来自 安徽芜湖
本帖最后由 gotit 于 2012-9-29 19:58 编辑

我的解法如下,f[A_] := (data = Map[Sort, Subsets[#, {3}] & /@ A, {2}];
  MapIndexed[
   Complement[#1,
     Intersection[#1, Flatten[Delete[data, First@#2], 1]]] &, data])

计算1000组数据时需要4秒.
回复 不支持

使用道具 举报

 楼主| 发表于 2012-9-29 21:10:40 | 显示全部楼层 来自 上海
gotit 发表于 2012-9-29 19:57
我的解法如下,f[A_] := (data = Map[Sort, Subsets[#, {3}] & /@ A, {2}];
  MapIndexed[
   Complement[# ...

谢谢,不过没看懂,这里面第一变量#1和第二变量#2指的是什么,是将要代入哪个数,能不能解释一下
回复 不支持

使用道具 举报

发表于 2012-9-29 21:53:10 | 显示全部楼层 来自 安徽芜湖
derwille 发表于 2012-9-29 21:10
谢谢,不过没看懂,这里面第一变量#1和第二变量#2指的是什么,是将要代入哪个数,能不能解释一下 ...

我这是定义了一个函数啊,使用的时候直接f[数据]就行了...
我的代码主要就是用了几个集合运算,没什么内容的,仔细看下就明白了...
回复 不支持

使用道具 举报

 楼主| 发表于 2012-9-29 22:03:44 | 显示全部楼层 来自 上海
gotit 发表于 2012-9-29 21:53
我这是定义了一个函数啊,使用的时候直接f[数据]就行了...
我的代码主要就是用了几个集合运算,没什么内容 ...

我知道,你这个确实很快,我算我那个1500Length长度的数组3.6秒就算出来,但是没看懂函数里面表示的意思,这个Delete[data, First@#2]表示什么意思,data中的哪部分数表示#1哪部分表示#2,这个我就没看懂
回复 不支持

使用道具 举报

发表于 2012-9-29 22:08:59 | 显示全部楼层 来自 安徽芜湖
derwille 发表于 2012-9-29 22:03
我知道,你这个确实很快,我算我那个1500Length长度的数组3.6秒就算出来,但是没看懂函数里面表示的意思 ...

#1和#2更函数MapIndexed的用法有关,我的表达能力不行,看一下帮助吧.
回复 不支持

使用道具 举报

 楼主| 发表于 2012-9-29 22:13:09 | 显示全部楼层 来自 上海
gotit 发表于 2012-9-29 22:08
#1和#2更函数MapIndexed的用法有关,我的表达能力不行,看一下帮助吧.

好,谢谢
回复 不支持

使用道具 举报

发表于 2012-9-29 22:13:44 | 显示全部楼层 来自 安徽芜湖
简要说一下我的步骤吧
1,将表里的每一个元素的三元子集求出来,用Sort排序.
2,对于每个元素,选出三元子集里和[表中的其他部分]没交集的元素
回复 不支持

使用道具 举报

发表于 2012-9-29 22:28:13 | 显示全部楼层 来自 安徽芜湖
本帖最后由 gotit 于 2012-9-29 22:32 编辑

发现这个可以用并行计算,速度能提高不少:
f[A_] := (data = Map[Sort, Subsets[#, {3}] & /@ A, {2}];
  Parallelize@
   MapIndexed[
    Complement[#1,
      Intersection[#1, Flatten[Delete[data, First@#2], 1]]] &, data])

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-26 13:11 , Processed in 0.041403 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表