2017-10-14 4 views
0

J'ai des problèmes pour essayer d'échelonner une matrice 5x5. J'ai d'abord provoqué une ligne nulle vers la dernière ligne du tableau (cela a fonctionné), puis j'ai essayé de faire une ligne dont l'indice le plus élevé reste inférieur à celui avec un index plus petit, mais dans la ligne:Matrice de stagging sur Python

if pivot_index[i] > pivot_index[line_aux] and line_aux < 5 and i < 5: 

du code, le compilateur avertit que l'index de la liste est hors de portée, mais je ne sais pas pourquoi (c'est le problème), ou comment le résoudre. L'algorithme suit ci-dessous:

import numpy as np 
def search_pivot(L): 
    if (np.nonzero(L)[0]).size == 0: 
     return -1 
    else: 
     return np.nonzero(L)[1][0] 

def find_pivot_index(mat): 
    pivot = [] 
    for i in range(5): 
     pivot.append(search_pivot(np.array(mat[i]))) 
    return pivot 

mat = np.matrix([[0,5,2,7,8],[0,0,4,14,16],[0,0,0,0,0],[2,6,10,16,22],[3,5,8,9,15]]).astype(float) 
print("Original array:\n",mat,"\n") 

pivot_index = find_pivot_index(mat) 

line_aux = 0 
for i in range(5): 
    line_aux = line_aux + 1 
    if pivot_index[i] > pivot_index[line_aux] and line_aux < 5 and i < 5: 
     m = mat.tolist() 
     (m[i],m[linha_aux]) = (m[linha_aux],m[i]) 
     mat = np.matrix(m) 
     pivot_index = find_pivot_index(mat) 

print(mat,"\n") 

line_aux = 0 
for i in range(5): 
    line_aux = line_aux + 1 
    if pivot_index[i] == -1 and line_aux < 5 and i < 5: 
     m = mat.tolist() 
     (m[i],m[linha_aux]) = (m[linha_aux],m[i]) 
     mat = np.matrix(m) 
     pivot_index = find_pivot_index(mat) 

print(mat) 
+0

Salut Andrew, vous pourriez être intéressé par https://es.stackoverflow.com/ –

+0

(cependant, s'il vous plaît éviter les envois multiples, il serait préférable de publier le code espagnol directement sur la place es.stackoverflow.com –

+0

En outre, qu'est-ce qu'une matrice décalée, ou pour décaler un tableau? Je ne reconnais pas cela comme un terme standard. –

Répondre

0

L'opérateur and en python est un short-circuit boolean operator

Cela signifie qu'il ne procèdera à son évaluation la partie à droite de and si le côté gauche est True; si le côté gauche est False, puisque cela détermine complètement le résultat de l'opération booléenne, la partie droite n'est pas évaluée. Cela permet à un programmeur d'effectuer un test sur le côté gauche, avant de procéder à une évaluation plus «risquée» qui pourrait entraîner une erreur.

Dans votre code, vous avez le test à venir après l'opération risquée. Vous vérifiez si linha_aux (peu importe ce que cela signifie) est inférieur à 5 après vous avez essayé d'indexer pivos_indices avec un linha_aux de 5 déjà. (Cela se produit lorsque i = 4, depuis la première ligne de la boucle est d'incrémenter linha_aux

Par conséquent:.

  • Pour « simplement » éviter le « hors de l'indice » erreur, mettre des tests avant risque opérations:

    if line_aux < 5 and i < 5 and pivot_index[i] > pivot_index[line_aux]: 
    
  • vous voudrez peut-être considérer si, en fait, vous aviez l'intention d'augmenter linha_aux à la fin de la boucle plutôt que au début, si cela est plus logique de votre algorithme, rappelez-vous des tableaux de python sont 0- indexé

+0

Mais j'ai essayé de changer la variable, mais l'erreur persiste. Le but est de faire ressembler la matrice à une échelle (ou l'effet d'une échelle): une rangée dont le pivot a l'indice le plus élevé devrait être en dessous d'une rangée qui a un pivot avec un indice inférieur. De plus les lignes nulles sont toujours les dernières dans le tableau. J'ai essayé d'éditer le code, j'espère que vous comprenez. Merci d'avance! –

+0

J'ai compris votre suggestion, je vais essayer. –