【问题标题】:Use double Do loop with one using the result of the previous one every time it runs每次运行时使用前一个循环的结果使用双循环
【发布时间】:2021-08-22 22:32:01
【问题描述】:

我有一个 Do 循环,在其中我正在寻找符合 If 内部条件的某些参数的值,并使用这些值运行另一个 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 中。

【问题讨论】:

    标签: loops iterator iteration wolfram-mathematica do-loops


    【解决方案1】:
    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},
      {mA, evsA} = helper1;
      If[Greater @@ evsA,
       PutAppend[{Flatten@mA, mA}, "list"];
       {mB, evsB} = helper1;
       h2 = helper2[mA, mB, evsB];
       If [Greater @@ evsB && h2, PutAppend[{Flatten@mB, mB, h2}], 
        "list2"]];
      ],
     100]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2015-02-10
      • 2021-11-25
      • 2023-03-11
      相关资源
      最近更新 更多