2014-02-05 4 views
1
#ADD STRING MATRIX AND NUM MATRIX Fraction(3).limit_denominator(10)from fractions import Fraction 
#ONLY WORKS FOR SQUARE ONES RIGHT NOW! 
from fractions import Fraction 

def make1(nm,x): 
    if nm[x][x]!=1: 
     print("Divide R1 by ",Fraction(nm[x][x]).limit_denominator(10)) 
     tempr = multiply(nm[x],1/nm[x][x]) 
     nm[x] = tempr 
    return nm 

def convert(n): 
    try: 
     return float(n) 
    except ValueError: 
     num, denom = n.split('/') 
     return float(num)/float(denom) 

def convertm(m): 
    lm = len(m) 
    lx = len(m[0]) 
    tempn = [0]*lx 
    temps = [[]]*lm 
    print(temps) 
    cnt = 0 
    for x in m: 
     tempn = x 
     for n in x: 
      temps[cnt].append(str(Fraction(n).limit_denominator(10))) 
      print(n) 
     cnt+=1 
     print(temps) 

def mprint(matrix): 
    s = [[str(e) for e in row] for row in matrix] 
    lens = [max(map(len, col)) for col in zip(*s)] 
    fmt = '\t'.join('{{:{}}}'.format(x) for x in lens) 
    table = [fmt.format(*row) for row in s] 
    print('\n'.join(table)) 

def subtract(r1,r2): #r1-r2 
    tempr = [0]*len(r1) 
    for x in range (0,len(r1)): 
     tempr[x] = r1[x]-r2[x] 
    return tempr 

def multiply(r1,n): 
    tempr = [0]*len(r1) 
    for x in range (0,len(r1)): 
     tempr[x] = r1[x]*n 
    return tempr 

def ans(nm): 
    end = len(nm[0]) 
    cnt = 0 
    for x in nm: 
     cnt+=1 
     print("X",cnt,"=",x[end-1]) 

equ = int(input("How many equasions are in the linear system? ")) 
#unk = int(input("How many unkowns are in the linear system? ")) 
nm = [0] * equ 
sm = [0] * equ 
for x in range (0,equ): 
    tempinput = input("Please enter line "+str(x+1)+" of the matrix: ") 
    templist = [convert(n) for n in tempinput.split()] 
    nm[x] = templist 
    sm[x] = tempinput.split() 

mprint(nm) 

nm = make1(nm,0) 

mprint(nm) 

for p in range (0,equ-1): 

    for x in range (p,equ-1): 
     print("Subtract ",Fraction(nm[x+1][p]).limit_denominator(10),"*",p+1,"by",p+2) 
     tempr = multiply(nm[p],nm[x+1][p]) 
     nm[x+1] = subtract(tempr,nm[x+1]) 
     print("FIRST X: ",x,"P",x)     
     mprint(nm) 
     nm = make1(nm,p+1) 
     mprint(nm) 

#GOIN BACK 
for p in range (0,equ-1): 
    for x in range (0,equ-(p+1)): 
     print("Subtract ",x,"by",Fraction(nm[x][2-p]).limit_denominator(10),"*",3) 
     tempr = multiply(nm[2-p],nm[x][2-p]) 
     nm[x]= subtract(nm[x],tempr) 
     print("SECOND X: ",x,"P",x) 

    mprint(nm) 

ans(nm) 

##or x in range (0,equ): 
    # print() 

#g = nm[1][0]-1 
#print("") 
#tempr = multiply(nm[0],g/nm[0][0]) 
#nm[0]=tempr 
#tempr = subtract(nm[1],nm[0]) 
#nm[0] = tempr 

Pastebin of my codeКопировать массив поплавков в массив строк

ИТАК, где моя актуальная проблема находится в невыполненном (потому что я не мог заставить его работать) Защита convertm. То, что это должно сделать, это взять матрицу с числами (nm) и принять каждое значение и преобразовать ее в строку как фракции (x/x), если необходимо, и сохранить ее в матрице строк (см). Вот что сегмент кода я ссылающийся ...

def convertm(m): 
    lm = len(m) 
    lx = len(m[0]) 
    tempn = [0]*lx 
    temps = [[]]*lm 
    print(temps) 
    cnt = 0 
    for x in m: 
     tempn = x 
     for n in x: 
      temps[cnt].append(str(Fraction(n).limit_denominator(10))) 
      print(n) 
     cnt+=1 
     print(temps) 

Я добавил некоторые печатные издания, чтобы попробовать и испытать то, что, черт возьми, происходит во время него. Я получаю вывод только последней строки, повторяющейся во всех строках. Я думаю, что у меня нет оператора возврата в настоящее время только потому, что я пытался заставить это работать. ИТАК для примера, если массив импортируется то есть ...

[[1,2,3],

[4,5,6],

[7,8,9 ]]

Это будет выводить (набор временные секретари к)

[[ '7', '8', '9'],

[ '7', '8', '9'] ,

[ '7', '8', '9']]

Хочу к выходу (набор временные секретари к)

[[ '1', '2', '3'],

[ '4', '5', '6'],

[ '7', '8', '9']]

Также я использую Python 3.3.1

(возможно, нужно обновить до 3.3.3, но это не то, что мы обсуждаем!) У меня нет абсолютно никакой идеи, почему я t делает это, и любая небольшая помощь будет очень оценена!

СПАСИБО

Я также прошу прощения, если это форматирование ужасна Я новичок в этом, и я копировать/вставить это с другого форума Я очень отчаянный знать, что здесь происходит.

+1

Я бы удалил огромный блок кода наверху. Я полностью проигнорировал это, чтобы ответить на вопрос. Это заставит большинство пользователей отказаться от попытки ответить на вопрос. – SethMMorton

+0

Как правило, вы получите наилучшие результаты при задании вопроса, если вы разделите свой код на [минимальный минимум, необходимый для запуска и получения ошибки] (http://stackoverflow.com/help/mcve). – user2357112

ответ

1

Линия

temps = [[]]*lm 

составляет список списка, где каждый Подсписок указывает на тот же список в памяти. Итак, если вы измените один, вы измените их все. Вот почему вы видите поведение, которое видите.

Изменить его

temps = [[] for _ in range(lm)] # xrange on python2 

, чтобы получить различные подсписки.

+0

Это сработало вам большое спасибо за помощь! Это решило много разочарования, которое я пережил! – Jeothesmar

Смежные вопросы