Hola, y bienvenido a esta 3er entrada en la serie de operaciones en matrices con Python. En esta ocasión, como podrán leer en el título, se trata sobre como podemos calcular el producto de matrices por un escalar con python.
Una vez más aprovecho para invitarte a que me sigas en mis redes Twitter o en la Fanpage de Facebook, donde podrás estar informado de nuevas entradas del blog, o si tienes alguna duda o comentario puedes decirmelo sin problema.
Operaciones con matrices en python
Hasta el momento las entradas de esta serie han sido las siguientes:
Por si no tienes aún la clase Base, aquí la tienes:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author: Gabriel Cueto <TheMushr00m - @Mushr00m_Dev>
class Matrix:
_n = 0
_m = 0
_elems = None
def __init__(self, n, m):
"""Inicializa la matriz con valor 0 en cada posición"""
self._n = n
self._m = m
self._elems = []
for i in range(self._n):
self._elems.append([])
for j in range(self._m):
self._elems[i].append(0)
def define_elem(self, i, j, v):
""" Sobreescribe el valor de una celda """
self._elems[i][j] = v
def show_matrix(self):
""" Imprime los valores almacenados en la matriz """
for i in range(self._n):
for j in range(self._m):
# Imprime de una forma elegante la matriz
print("| {0} ".format(self.get_value_of_position(i, j)), sep=',', end='')
print('|\n')
def get_cols(self):
""" Devuelve el número de columnas en la matriz """
return self._m
def get_rows(self):
""" Devuelve el número de filas en la matriz """
return self._n
def get_value_of_position(self, i, j):
return self._elems[i][j]
def add(self, *matrix):
""" Puede recibir varias matrices como argumentos """
for i in range(self.rows):
row = []
for j in range(self.cols):
tmp = self.get_value_of_position(i, j)
for m in matrix:
tmp += m.get_value_of_position(i, j)
row.append(tmp)
yield row
cols = property(fget=get_cols)
rows = property(fget=get_rows)
Un poco de teoría
Un escalar x es un elemento que por lo general se encuentra en el conjunto de los números reales. El producto de una matriz A de m * n por un escalar x, es una operación binaria que toma por operandos a la matriz A y al escalar x y tiene por resultado una matriz C de m * n, donde para todo i, j indices válidos de C se cumple C(i,j) = x*A(i,j). Por ejemplo:
Llevando la teoría a código
La implementación del método como una función generadora es bastante simple como podemos observar a continuación:
def scalar_product(self, x):
for i in range(self.rows):
row = []
for j in range(self.cols):
row.append(self.get_value_of_position(i, j)*x)
yield row
Ahora, si deseamos probar el nuevo método, necesitamos escribir algo como lo siguiente:
m = Matrix(3, 3)
m.define_elem(0, 0, 1)
m.define_elem(0, 1, 2)
m.define_elem(0, 2, 3)
for e in m.scalar_product(3):
print(e)
Si observamos con atención, estamos definiendo una matriz con los valores de la primera fila, en correspondencia a los de la figura anterior, ahora, al ejecutar el código, los valores de la primera fila de la matriz resultante, deben coincidir con los valores de la matriz C de la figura anterior.
[3, 6, 9]
[0, 0, 0]
[0, 0, 0]
Hasta este momento, el código completo de nuestra clase quedaría de esta forma. Recuerda que todo el código está disponible en el repositorio de Github:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author: Gabriel Cueto <TheMushr00m - @Mushr00m_Dev>
class Matrix:
_n = 0
_m = 0
_elems = None
def __init__(self, n, m):
"""Inicializa la matriz con valor 0 en cada posición"""
self._n = n
self._m = m
self._elems = []
for i in range(self._n):
self._elems.append([])
for j in range(self._m):
self._elems[i].append(0)
def define_elem(self, i, j, v):
""" Sobreescribe el valor de una celda """
self._elems[i][j] = v
def show_matrix(self):
""" Imprime los valores almacenados en la matriz """
for i in range(self._n):
for j in range(self._m):
# Imprime de una forma elegante la matriz
print("| {0} ".format(self.get_value_of_position(i, j)), sep=',', end='')
print('|\n')
def get_cols(self):
""" Devuelve el número de columnas en la matriz """
return self._m
def get_rows(self):
""" Devuelve el número de filas en la matriz """
return self._n
def get_value_of_position(self, i, j):
return self._elems[i][j]
def add(self, *matrix):
""" Puede recibir varias matrices como argumentos """
for i in range(self.rows):
row = []
for j in range(self.cols):
tmp = self.get_value_of_position(i, j)
for m in matrix:
tmp += m.get_value_of_position(i, j)
row.append(tmp)
yield row
def scalar_product(self, x):
for i in range(self.rows):
row = []
for j in range(self.cols):
row.append(self.get_value_of_position(i, j)*x)
yield row
cols = property(fget=get_cols)
rows = property(fget=get_rows)
Y bien, es todo por esta ocasión, espero la explicación haya sido buena, cualquier comentario no dudes en dejarlo aquí abajo, o con confianza mencionalo por Twitter o en la Fanpage de Facebook, y aprovecho a invitarte para que me sigas en las redes.
Deja un comentario