Matrices

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.2 kB
2
Indexable
Never

Experiment No. 9 : Write a Python Program to compute following computation on matrices :


a)Addition of two matrices


b)Subtraction of two matrices


c)Multiplication of two matrices


d)Transpose of a matix


'''






import numpy






# initializing matrices


x = numpy.array([[1, 2], [4, 5]])


y = numpy.array([[7, 8], [9, 10]])






# using add() to add matrices


print("The element wise addition of matrix is : ")


print(numpy.add(x, y))






# using subtract() to subtract matrices


print("The element wise subtraction of matrix is : ")


print(numpy.subtract(x, y))






# using dot() to multiply matrices


print ("The product of matrices is : ")


print (numpy.dot(x,y))










# using "T" to transpose the matrix


print("The transpose of given matrix is : ")


print(x.T)


10------------------------------------------------------------------------------------------

class Sparse:
    def __init__(self, rows, columns):
        self._matrix = []
        self._num = 0
        self._rows = rows
        self._columns = columns
         
    def __repr__(self):
        prnt = f"Shape: {self._rows} x {self._columns}\n"
        for lst in self._matrix:
            prnt += lst.__repr__() + '\n'
        prnt += f"Total: {self._num}"
        return prnt
         
    def insert(self, row, column, value):
        if row < 0 | column < 0 | row >= self._rows | column >= self._columns:
            raise ValueError("Invalid row or column")
             
        if(value == 0):
            raise ValueError("Zeroes are not included in a sparse matrix")
         
        filled = False
        for i in range(self._num):
            if(self._matrix[i][0] < row):
                continue
            elif(self._matrix[i][0] > row):
                self._matrix.insert(i, [row, column, value])
                self._num += 1
                filled = True
                break
            elif(self._matrix[i][1] < column):
                continue
            elif(self._matrix[i][1] > column):
                self._matrix.insert(i, [row, column, value])
                self._num += 1
                filled = True
                break
            else:
                raise ValueError("The position is already filled")
        if(filled == False):
            self._matrix.append([row, column, value])
            self._num += 1
        return
     
    def remove(self, row, column):
        if row < 0 | column < 0 | row >= self._rows | column >= self._columns:
            raise ValueError("Invalid row or column")
             
        for i in range(num):
            if(self._matrix[i][0] == row | self._matrix[i][1] == column):
                return pop(i)
        return None
     
    def size(self):
        return self._num
     
    def shape(self):
        return tuple((self._rows, self._columns))
     
    def display(self):
        print(self)
     
    def add(self, obj):
        if(isinstance(obj, Sparse) != True):
            raise TypeError("add() method needs an object of type Sparse")
         
        if(self.shape() == obj.shape()):
            result = Sparse(self._rows, self._columns)
        else:
            raise ValueError("Invalid row or columns")
         
        i = 0
        j = 0
        k = 0
        while((i < self._num) & (j < obj._num)):
            if(self._matrix[i][0] < obj._matrix[j][0]):
                result._matrix.insert(k, self._matrix[i])
                k += 1
                i += 1
            elif(self._matrix[i][0] > obj._matrix[j][0]):
                result._matrix.insert(k, obj._matrix[j])
                k += 1
                j += 1
            elif(self._matrix[i][1] < obj._matrix[j][1]):
                result._matrix.insert(k, self._matrix[i])
                k += 1
                i += 1
            elif(self._matrix[i][1] > obj._matrix[j][1]):
                result._matrix.insert(k, obj._matrix[j])
                k += 1
                j += 1
            else:
                result._matrix.insert(k, list([self._matrix[i][0], self._matrix[i][1], self._matrix[i][2] + obj._matrix[j][2]]))
                k += 1
                i += 1
                j += 1
        while(i < self._num):
            result._matrix.insert(k, self._matrix[i])
            k += 1
            i += 1
        while(j < obj._num):
            result._matrix.insert(k, obj._matrix[j])
            k += 1
            j += 1
             
        result._num = k
        return result
     
    def fast_transpose(self):
        occurrence = []
        index = []
         
        for i in range(self._columns):
            occurrence.append(0)
        for i in range(self._num):
            occurrence[self._matrix[i][1]] += 1
         
        index.append(0)
        for i in range(1, self._columns):
            index.append(index[i-1] + occurrence[i-1])
             
        result = Sparse(self._columns, self._rows)
        result._num = self._num
        for i in range(self._num): result._matrix.append(list())
        for i in range(self._num):
            result._matrix[index[self._matrix[i][1]]] = list([self._matrix[i][1], self._matrix[i][0], self._matrix[i][2]])
            index[self._matrix[i][1]] += 1
        return result