Manipulation de liste - Boucle de fin


1

Étant donné deux matrices (a & b). Je veux mettre fin à la boucle For si toutes les valeurs dans la matrice (un moins b) sont plus petits que 7, contrairement à toute valeur dans la matrice (un moins b) est plus petit que 7. Quelqu'un peut-il m'aider avec ce problème?

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

Peut-être 'Max [a - b] <7' 27 août. 132013-08-27 18:46:09

  0

Connexe: [(8650)] (http://mathematica.stackexchange.com/q/8650/121) 28 août. 132013-08-28 10:47:59

3

Par exemple:

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

Puis

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[]]] 

Arrête à Q=12:

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

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

Alternative qui peuvent ou peuvent ne pas être plus rapide (les autres membres sont beaucoup, beaucoup mieux l'optimisation de la vitesse, si vous avez ce problème, vous devriez le dire):

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

Remplacer 7 par 0,001? : P 28 août. 132013-08-28 11:22:39

  0

Voir aussi le commentaire de Simon Woods, qui est un test plus simple et plus rapide. 28 août. 132013-08-28 11:25:23

  0

Merci. Maintenant, je veux terminer la boucle For si la différence entre A et B à chaque point de la matrice est inférieure à 0,001 (Aij-Bij). Comment puis-je réparer cela? 28 août. 132013-08-28 11:27:29

  0

ij est donné je suppose? Remplacer 7 par '0.001 (A [[i, j]] - B [[i, j]])' 28 août. 132013-08-28 11:30:35


1

Si le but est d'imprimer uniquement les matrices qui sont conformes à la contrainte (comme la dernière impression sont la première exception), peut-être (en utilisant la fonction de comparaison de 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

Bien sûr, vous pouvez simplement changer le test de comparaison au début de la séquence de commandes. 28 août. 132013-08-28 10:48:38

  0

Ou placez 'Print' dans le' If'. (Je ne vois pas comment le mettre au début le résoudrait.) 28 août. 132013-08-28 10:56:00

  0

@Anon merci et désolé, oui cela ne fonctionnerait que si a et b, Q (donc Qb) ont été définis en dehors des boucles et la première déclaration était la comparaison, alors il se casserait une fois que le test était vrai et avant l'impression mais comme structuré, je suis dans l'erreur. 28 août. 132013-08-28 11:07:23