-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatrix.py
140 lines (110 loc) · 3.3 KB
/
Matrix.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/python2
# -*- coding: utf-8 -*-
import random
def random_matrix(m, n):
matrix = []
for i in xrange(m):
row = []
n_alt = n
while n_alt > 0:
a = random.randint(0, 9)
row.append(a)
n_alt -= 1
matrix.append(row)
return matrix
def identity_matrix(m):
I = []
for i in xrange(m):
new_row = m * [0]
new_row[i] = 1
I.append(new_row)
return I
def show_matrix(matrix):
for row in matrix:
print row
def matrix_length(matrix):
return len(matrix[0])
def matrix_width(matrix):
return len(matrix)
def transpose_matrix(matrix):
transposed_matrix = []
for n in xrange(matrix_length(matrix)):
new_row = []
for row in matrix:
new_row.append(row[n])
transposed_matrix.append(new_row)
return transposed_matrix
def vector_addition(vector1, vector2):
if len(vector1) != len(vector2):
print "Wrong dimensions"
else:
new_vector = []
for n in xrange(len(vector1)):
a = vector1[n] + vector2[n]
new_vector.append(a)
return new_vector
def scalar_vector(vector, a):
new_vector = []
for element in vector:
alpha = a * element
new_vector.append(alpha)
return new_vector
def scalar_product(vector1, vector2):
if len(vector1) != len(vector2):
print "Wrong dimensions"
else:
product = 0
for n in xrange(len(vector1)):
a = vector1[n] * vector2[n]
product += a
return product
def matrix_addition(matrix1, matrix2):
if matrix_length(matrix1) != matrix_length(matrix2):
print "Wrong dimensions"
elif matrix_width(matrix1) != matrix_width(matrix2):
print "Wrong dimensions"
else:
new_matrix = []
for n in xrange(matrix_width(matrix1)):
new_row = vector_addition(matrix1[n], matrix2[n])
new_matrix.append(new_row)
return new_matrix
def scalar_matrix(matrix, a):
new_matrix = []
for row in matrix:
new_row = scalar_vector(row, a)
new_matrix.append(new_row)
return new_matrix
def matrix_product(matrix1, matrix2):
if matrix_length(matrix1) != matrix_width(matrix2):
print "Wrong dimensions"
else:
new_matrix = []
for row in matrix1:
new_row = []
for column in transpose_matrix(matrix2):
alpha = scalar_product(row, column)
new_row.append(alpha)
new_matrix.append(new_row)
return new_matrix
def nullify_element(vector1, vector2, n):
if vector2[n] == 0:
return vector2
else:
return vector_addition(vector1, scalar_vector(vector2, -1.0 * vector1[n] / vector2[n]))
def row_echelon(matrix):
new_matrix = matrix
for m in xrange(matrix_width(matrix) - 1):
for n in range(m + 1, matrix_width(matrix) + 1):
try:
new_matrix[n] = nullify_element(matrix[m], matrix[n], m)
except IndexError:
pass
return new_matrix
def extract_diagonal(matrix):
new_matrix = matrix
for n in xrange(matrix_width(matrix)):
for i in xrange(matrix_length(matrix)):
if n != i:
(matrix[n])[i] = 0
return new_matrix