[ Foro de Python ]
Buenas tardes, me encuentro con el siguiente problema:
- Leer dos enteros, n y m.
- Leer un vector de n componentes (reales)
- Leer m vectores de n componentes cada uno y los guarde en una matriz.
- Escriba por pantalla el vector de los m vectores que esté más cerca del primero, usando la distancia Euclídea.
Practicamente he conseguido todo lo que pide, llegando hasta localizar la mínima distancia. Pero no soy capaz de relacionar la posición de esa mínima distancia con el vector de la matriz al que corresponde para imprimirlo. A ver si alguien puede darme alguna pista. Muchas gracias. El código que he hecho es este:
n = int(input())
m = int(input())
def leervector():
vector=[float(x) for x in input().split()]
return vector
def leervectores():
matriz=[]
for i in range(m):
for j in range(n):
vectores=[float(x) for x in input().split()]
matriz.append(vectores)
break
return matriz
def matrizrestas(m,n):
restas=[]
for i in range (m):
restas.append([0]*n)
for i in range(m):
for j in range(n):
restas[i][j]+=matriz[i][j]-vector[j]
return restas
def matrizcuadrados(m,n):
cuadrados=[]
for i in range(m):
cuadrados.append([0]*n)
for i in range(m):
for j in range(n):
cuadrados[i][j]+=restas[i][j]*restas[i][j]
return cuadrados
def matrizsumas(m,n):
sumatorio=[]
for i in cuadrados:
suma=0
for j in i:
suma=suma+j
sumatorio.append(suma)
return sumatorio
def matrizdistancias(m):
distancias=[]
for i in range(m):
distancias.append(sumatorio[i]**0.5)
return distancias
def distanciaminima(n,distancias):
menordistancia=distancias[0]
suma=0
for i in distancias:
suma=suma+i
if menordistancia>i:
menordistancia=i
return menordistancia
vector = leervector()
matriz = leervectores()
print(matriz)
restas=matrizrestas(m,n)
print(restas)
cuadrados=matrizcuadrados(m,n)
print(cuadrados)
sumatorio=matrizsumas(m,n)
print(sumatorio)
distancias=matrizdistancias(m)
print (distancias)
menordistancia=distanciaminima(n,distancias)
print (menordistancia)
La distancia euclídea no se calcula simplemente sumando: es la raíz de las sumas de las distancias entre cada componente al cuadrado:
https://es.wikipedia.org/wiki/Distancia_euclidiana
La lógica sería algo parecido a:
dist = distancia(vector 0, vector 1)
pos = 1
para todos los valores i de desde 2 hasta m
dist2 = distancia(vector 0, vector i)
si (dist2 < dist) entonces dist = dist2, pos = i
escribir vector pos
Muchas gracias Nacho. Por lo que comentas de la distancia Euclídea, sí que la tengo bien calculada. Primero realicé las restas dato a dato, después las elevé al cuadrado, posteriormente hice el sumatorio, y al final la raíz cuadrada, que son las operaciones que me dan las distancias de cada fila con el vector inicial. Eso lo hace bien, reportándome la distancia mínima correcta. El problema que tengo es que al final, por ejemplo, si el primer vector de la matriz es el más cercano, me reporta su distancia al vector inicial como distancia mínima, pero lo que no sé es cómo indicar para que desde esa distancia mínima que reporte al vector al que corresponde.
Voy a intentar introducir la idea que me has aportado a ver si soy capaz. Por que no ando muy ducho con este tema.
Vuelvo a agradecer el tiempo que me has dedicado. Un saludo
Buenas tardes, problema resuelto. Solo me queda un pequeño arreglo, y que no se como hacer para que en el ultimo print, me salgan los componentes del vector sin corchetes y separados por espacios en banco. Mil gracias. Aqui dejo el codigo que funciona perfecto.
n = int(input())
m = int(input())
def leervector():
vector=[float(x) for x in input().split()]
return vector
def leervectores():
matriz=[]
for i in range(m):
for j in range(n):
vectores=[float(x) for x in input().split()]
matriz.append(vectores)
break
return matriz
def matrizrestas(m,n):
restas=[]
for i in range (m):
restas.append([0]*n)
for i in range(m):
for j in range(n):
restas[i][j]+=matriz[i][j]-vector[j]
return restas
def matrizcuadrados(m,n):
cuadrados=[]
for i in range(m):
cuadrados.append([0]*n)
for i in range(m):
for j in range(n):
cuadrados[i][j]+=restas[i][j]*restas[i][j]
return cuadrados
def matrizsumas(m,n):
sumatorio=[]
for i in cuadrados:
suma=0
for j in i:
suma=suma+j
sumatorio.append(suma)
return sumatorio
def matrizdistancias(m):
distancias=[]
for i in range(m):
distancias.append(sumatorio[i]**0.5)
return distancias
def vectorprox(m,n):
menordistancia=distancias[0]
pos=0
for i in range (2,m):
menordistancia2=distancias[i]
if menordistancia2<menordistancia:
menordistancia=menordistancia2
pos=i
return matriz[pos]
vector = leervector()
matriz = leervectores()
print(matriz)
restas=matrizrestas(m,n)
print(restas)
cuadrados=matrizcuadrados(m,n)
print(cuadrados)
sumatorio=matrizsumas(m,n)
print(sumatorio)
distancias=matrizdistancias(m)
print (distancias)
menordistancia=vectorprox(m,n)
print(menordistancia)
Mostrar el contenido de un vector o una lista es fácil. La forma más simple es recorrer sus elementos con un "for", así:
lista = [10, 20, 30]
# Escribe [10, 20, 30]
print(lista)
# Escribe sin corchetes ni comas
for i in lista:
print(i, end=' ')
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)