如何解决使用双 Do 循环,每次运行时使用前一个循环的结果
我有一个 Do 循环,我正在寻找符合 If 内条件的某些参数的值,并使用这些值运行另一个 Do 以使用先前找到的值对表达式进行另一次计算,如何为满足第一个 Do 循环中条件的参数的每组值执行此操作,自动转到第二个 Do 循环,最后,将两个 Do 循环中找到的值放在同一个列表中,这里是一个示例我所做的,
Do[ a={{a1,a2},{a3,a4}};
a1=RandomReal[{0,1}]; a2=RandomReal[{0,1}];
a3=RandomReal[{0,1}]; a4=RandomReal[{0,1}];
If[Eigenvalues[a][[1]]>Eigenvalues[a][[2]],PutAppend[{a1,a2,a3,a4,a},"list"]],{100}]//AbsoluteTiming
dn=ReadList["list"];
所以因为我在列表中得到了一些值,
Do[ b={{b1,b2},{b3,b4}};
b1=RandomReal[{0,1}]; b2=RandomReal[{0,1}];
b3=RandomReal[{0,1}]; b4=RandomReal[{0,1}];
h[i_]:=Eigenvalues[b][[1]]dn[[i,1]]-dn[[i,4]]+Tr[b.dn[[i,5]]];
If[h[i]>0&&Eigenvalues[b][[1]]>Eigenvalues[b][[2]],PutAppend[{b1,b2,b3,b4,b,h[i]},"list2"]],{i,1,Length[dn]}]//AbsoluteTiming
但是正如您所看到的,即使列表中的值不一定满足第二个 Do 循环的条件,我也必须使用内存,因为“列表”。我不想使用相同的 Do 循环并将所有条件放在同一个 If 中。
解决方法
helper1 := With[{mA = RandomReal[{0,1},{2,2}]},{mA,Eigenvalues@mA}
]
helper2[mA_,mB_,evsB_] :=
First[evsB]*mA[[1,1]] - mA[[2,2]] + Tr[mB.mA];
Do[Module[{mA,mB,evsA,evsB,h2},evsA} = helper1;
If[Greater @@ evsA,PutAppend[{Flatten@mA,mA},"list"];
{mB,evsB} = helper1;
h2 = helper2[mA,evsB];
If [Greater @@ evsB && h2,PutAppend[{Flatten@mB,h2}],"list2"]];
],100]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。