Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- EPS = 10 ** -9
- from random import randint
- import numpy as np
- from numpy.linalg import svd
- import sys
- def getMatrixFromFile(fileName, flag=False):
- with open(fileName, 'r') as f:
- n = int(f.readline())
- blank = f.readline()
- # b = [float(f.readline()) for i in range(n)]
- lines = f.readlines()
- a = [dict() for i in range(n)]
- for it in lines:
- vals = it.split(',')
- z, x, y = float(vals[0]), int(vals[1]), int(vals[2])
- a[x][y] = a[x].get(y, 0) + z
- if len(a[x]) > 10 and flag:
- print("Matricea contine o linie cu mai mult de 10 elemente!!!")
- checksim(a,n)
- return n, a
- def add(a, b, n):
- ans = [dict() for i in range(n)]
- for i in range(n):
- for it in a[i]:
- ans[i][it] = ans[i].get(it, 0) + a[i][it]
- for it in b[i]:
- ans[i][it] = ans[i].get(it, 0) + b[i][it]
- return ans
- def mul(a, b, n):
- ans = [dict() for i in range(n)]
- for i in range(n):
- for j in range(n):
- for k in a[i]:
- if j in b[k]:
- ans[i][j] = ans[i].get(j, 0) + a[i][k] * b[k][j]
- return ans
- def mulVector(a, b, n):
- ans = [0 for i in range(n)]
- for i in range(n):
- for k in a[i]:
- ans[i] += a[i][k] * b[k]
- return ans
- def compareMatrix(a, b, n):
- for i in range(n):
- if len(a[i]) != len(b[i]):
- return False
- for j in a[i]:
- if j not in b[i]:
- return False
- if abs(a[i][j] - b[i][j]) > EPS:
- print(a[i][j], b[i][j])
- return False
- return True
- def dotprod(w,v):
- s=0
- for i in range(len(w)):
- s+=w[i]*v[i]
- return s
- def vecnorm(v):
- norm=0
- for i in range(len(v)):
- norm+=v[i]**2
- norm=norm**0.5
- return norm
- def checksim(a,n):
- c=1
- for i in range(len(a)):
- for j in a[i].keys():
- if i not in a[j].keys() or abs(a[i][j]-a[j][i]) > EPS and i!=j:
- #print("Avem lipsa de simetrie!!!")
- if(c==1):
- print(i,j)
- c=0
- if c==0:
- print("Avem lipsa de simetrie!!!")
- else:
- print("Matrice simetrica")
- def powermethod(a,n):
- #get vector
- v=list()
- vv=list()
- k=0
- for i in range(n):
- v.append(randint(0,10000))
- vv.append(0)
- norm=vecnorm(v)
- for i in range(n):
- v[i]=v[i]/norm
- w=mulVector(a,v,n)
- lamb=dotprod(w,v)
- lamv=[lamb*i for i in v]
- test=[w[i]-lamv[i] for i in range(n)]
- #print(test)
- #print(w)
- #print(v)
- #print(len(v))
- while vecnorm(test)>n*EPS and k<=1000000:
- norm=vecnorm(w)
- for i in range(n):
- vv[i]=w[i]/norm
- w=mulVector(a,vv,n)
- lamb1=dotprod(w,vv)
- lamv=[lamb*i for i in v]
- test=[w[i]-lamv[i] for i in range(n)]
- k+=1
- lamb=lamb1
- v=[j for j in vv]
- print(k)
- print(lamb)
- print(vecnorm(test))
- def getMatrixFromFile2(fileName):
- with open(fileName, 'r') as f:
- a = [list(map(float, it.split())) for it in f.readlines()]
- return a, len(a), len(a[0])
- def genrandomvector(size):
- b=list()
- for i in range(size):
- b.append(randint(0,10000))
- return b
- def Ainf(a, n, m):
- aux = [0.0 for i in range(n)]
- for i in range(n):
- for j in range(m):
- aux[i] += a[i,j]
- max=aux[0]
- for i in range(len(aux)):
- if aux[i]>max:
- max=aux[i]
- #print(aux)
- return max
- if __name__ == '__main__':
- #print("Matrice proprie")
- #n1, a1 = getMatrixFromFile('a6.txt')
- #print("Matrice laborator")
- #n1, a1 = getMatrixFromFile('m_rar_sim_2018.txt')
- #print(n2, a2)
- #powermethod(a1,n1)
- a,n,m=getMatrixFromFile2('a62.txt')
- u,s,vstar=svd(np.asmatrix(a), full_matrices=True)
- #print("Singular values:")
- #print(s)
- #print(len(s))
- rk=0
- min=s[0]
- max=s[0]
- #print("Rank:")
- sinv=np.zeros((n,m))
- for i in range(len(s)):
- if s[i]!=0:
- rk+=1
- if max<s[i]:
- max=s[i]
- if min>s[i]:
- min=s[i]
- sinv[i][i]+=1/s[i]
- #print(rk)
- #print("Nr conditionare:")
- #print(max/min)
- print("Pseudoinversa:")
- ainv=np.matmul(np.matmul(np.transpose(vstar), np.transpose(np.asmatrix(sinv))),np.transpose(u))
- print(ainv)
- # print(np.linalg.pinv(np.asmatrix(a)))
- b=genrandomvector(n)
- #x, res, rank, ss=np.linalg.lstsq(a, b)
- xx=np.matmul(ainv, b)
- print("Solutie:")
- print(xx)
- #print(xx)
- #print(len(x))
- print("Dati val:")
- k=int(input())
- #print(k)
- while k>rk:
- print("Valoare invalida")
- k=int(input())
- As=np.zeros((n,m))
- for i in range(k):
- cu=u[:,i]
- cv=np.transpose(vstar)[:,i]
- mataux=np.multiply(s[i],np.matmul(cu, np.transpose(cv)))
- As=np.add(As, mataux)
- dif=np.subtract(np.asmatrix(a), As)
- print("Norma")
- #print(np.asmatrix(dif)[1][0])
- print(Ainf(np.asmatrix(dif), n, m))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement