Wolfram mathematica 寻找满足一定条件的对的有效方法
让Wolfram mathematica 寻找满足一定条件的对的有效方法,wolfram-mathematica,Wolfram Mathematica,让A和B成为列表。我要找到所有的{x,y}对,其中x在A中,y在B中,并且一些条件Cond[x,y]为真。这就是我想到的,但它相当麻烦,我怀疑有更好的方法 AllPairs[A_, B_, Cond_] := Module[{i, k, C, Cp}, C = {}; For[i = 1, i <= Length[A], i++, Cp = Select[B, Cond[A[[i]], #] &]; C = C~Join~Table[{A[[i]], Cp[[k]]
A
和B
成为列表。我要找到所有的{x,y}
对,其中x
在A
中,y
在B
中,并且一些条件Cond[x,y]
为真。这就是我想到的,但它相当麻烦,我怀疑有更好的方法
AllPairs[A_, B_, Cond_] := Module[{i, k, C, Cp},
C = {};
For[i = 1, i <= Length[A], i++,
Cp = Select[B, Cond[A[[i]], #] &];
C = C~Join~Table[{A[[i]], Cp[[k]]}, {k, 1, Length[Cp]}];
];
Return[C];
]
我对这段代码的另一个问题是它不容易泛化。我想要一个函数,它接受列表A1,A2,…,一个
和一些条件Cond[x_uuuuu]
,并输出x1
在A1
中的所有n元组{x1,x2,…,xn}
xn
在An
中,并且Cond[x1,x2,…,xn]
为真
最后,是否有一个内置函数,用于计算两个或多个列表的长度
谢谢 如果您需要检查所有对(即,没有用于减少问题的对称性),那么最简单的方法可能是
选择和元组:
allPairs[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
这正是我认为你想要的:
a=Range[4]; b=Range[3,5];
allPairs[a,b,EvenQ[#1+#2]&]
Out[37]= {{1,3},{1,5},{2,4},{3,3},{3,5},{4,4}}
关于生成配对的更多工具,请查阅:
希望这能有所帮助。另一种解决方案使用了ReplaceList
——它比Janus的答案慢4倍(比原来的方法慢3倍),但可能内存效率更高
In[1]:= allPairs1[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
In[2]:= allPairs2[a_,b_,cond_]:=ReplaceList[{a,b},
{{___,x_,___},{___,y_,___}}/;cond[x,y]:>{x,y}]
In[3]:= aa=RandomInteger[{0,10^5},{1000}];
In[4]:= bb=RandomInteger[{0,10^5},{1000}];
In[5]:= test1=allPairs1[aa,bb,EvenQ[#1+#2]&];//Timing
Out[5]= {4.99,Null}
In[6]:= test2=allPairs2[aa,bb,EvenQ[#1+#2]&];//Timing
Out[6]= {19.12,Null}
In[7]:= test1==test2
Out[7]= True
对于这样的问题,我个人喜欢使用用例并附加条件。不过,我不确定效率如何
lst1 = {1, 2, 3, 4};
lst2 = {3, 4, 5};
Cases[Tuples[{lst1, lst2}], {x_, y_} /; EvenQ[x + y]]
我发现这种方法简单且通用,至少对于小列表(我使用的类型!)
啊!<代码>元组
正是我所需要的(没有仔细阅读帮助文件)。谢谢
In[1]:= allPairs1[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
In[2]:= allPairs2[a_,b_,cond_]:=ReplaceList[{a,b},
{{___,x_,___},{___,y_,___}}/;cond[x,y]:>{x,y}]
In[3]:= aa=RandomInteger[{0,10^5},{1000}];
In[4]:= bb=RandomInteger[{0,10^5},{1000}];
In[5]:= test1=allPairs1[aa,bb,EvenQ[#1+#2]&];//Timing
Out[5]= {4.99,Null}
In[6]:= test2=allPairs2[aa,bb,EvenQ[#1+#2]&];//Timing
Out[6]= {19.12,Null}
In[7]:= test1==test2
Out[7]= True
lst1 = {1, 2, 3, 4};
lst2 = {3, 4, 5};
Cases[Tuples[{lst1, lst2}], {x_, y_} /; EvenQ[x + y]]
Cases[Tuples[{lst1, lst2}], {x_ /; EvenQ[x], y_ /; OddQ[y]}]