列表操作 - 结束循环


1

给定两个矩阵(a & b)。如果全部矩阵(a减b)小于7,我想结束For循环,与相比,矩阵(a减b)中的任何值都小于7.任何人都可以帮助我有这个问题?

For[Q = 0, Q <= 20, Q += 1, 
    Print[Q]; 
    Print[a = {{40, 40, 40}, {40, 40, 40}, {40, 40, 40}}]; 
    Print[b = Q {{4, 4, 4}, {4, 3, 4}, {4, 4, 4}}]; 

    compare[matrix_, length_, width_, value_] := 
    Module[{state}, state = False; For[i = 1, i <= length, i++, 
    For[j = 1, j <= width, j++, 
     If[matrix[[i, j]] < value, state = True]]]; Return[state]]; 

    If[compare[a - b, 3, 3, 7], Break[],]]; 
+2

也许'Max [a - b] <7' 27 8月. 132013-08-27 18:46:09

  0

相关:[(8650)](http://mathematica.stackexchange.com/q/8650/121) 28 8月. 132013-08-28 10:47:59

3

例如:

compare[a_, b_] := And @@ (Less[#, 7] & /@ [email protected](a - b)) 

然后

For[Q = 0, Q <= 20, Q += 1, Print[Q]; 
Print[a = {{40, 40, 40}, {40, 40, 40}, {40, 40, 40}}]; 
Print[b = Q {{4, 4, 4}, {4, 3, 4}, {4, 4, 4}}]; 
If[compare[a, b], Break[]]] 

停止在Q=12

{{40,40,40},{40,40,40 },{40,40,40}}

{{48,48,48},{48,36,48},{48,48,48}}

替代,其可以是或可以不是更快(其他成员是多少,在更好的速度优化,如果你有这个问题,你应该这么说):

compare2[a_, b_] := ! Or @@ [email protected]@[email protected](a - b - 7) 
  0

将7替换为0.001? :P 28 8月. 132013-08-28 11:22:39

  0

另请参阅西蒙伍兹的评论,这是一个更简单,更快速的测试。 28 8月. 132013-08-28 11:25:23

  0

谢谢。现在我想结束For循环,如果矩阵中每个点的A和B之间的差值小于0.001(Aij-Bij)。我怎样才能解决这个问题? 28 8月. 132013-08-28 11:27:29

  0

ij是我给的吗?用'0.001(A [[i,j]] - B [[i,j]])替换7'' 28 8月. 132013-08-28 11:30:35


1

如果目的是为了只打印与约束符合矩阵(作为最后一个印刷是第一个例外),可能(使用Anon的比较函数):

compare[a_, b_] := And @@ (Less[#, 7] & /@ [email protected](a - b)); 
a = {{40, 40, 40}, {40, 40, 40}, {40, 40, 40}}; 
b = {{4, 4, 4}, {4, 3, 4}, {4, 4, 4}}; 
Q = 0; 
While[compare[a, Q b] == False, Print[Q]; Print[a]; Print[Q b]; Q++] 
  0

当然,您可以将比较测试更改为命令序列的开头。 28 8月. 132013-08-28 10:48:38

  0

或者把'Print'放在'If'里面。 (我不明白怎么把它放在开头就能解决问题。) 28 8月. 132013-08-28 10:56:00

  0

@Anon谢谢你,对不起,是的,只有当a和b,Q(因此Qb)被定义在循环之外并且第一条语句是比较,那么一旦测试结果为真,打印之前它会中断,但是由于结构上我错了。 28 8月. 132013-08-28 11:07:23