Я пишу фрагмент кода, который будет инвертировать матрицу с использованием mpi4py
. Я получаю сообщение об ошибке, которое вызывает у меня проблемы.
Я помещаю 2 переменные по умолчанию m, n
, и пользователь вставляет числа в процесс rank 0
для заполнения матрицы. Процесс rank 0
отправляет матрицу process 1
и process 2
. В process 1
я инициализирую матрицу и определитель, вычисляю определитель и отправляю обратно в rank 0
. В process 2
я инициализирую матрицу, нахожу обратную матрицу и возвращаю обратную матрицу процессу 0.
Затем в process 0
я получаю определитель и обратную матрицу. Если определитель равен 0, то будет отправлено сообщение и программа завершится (обратную матрицу можно вычислить даже если определитель равен 0, но это неверно). Если не 0, программа напечатает обратную матрицу.
Обратите внимание: я знаю, что текущая реализация — не лучший способ распараллелить эту проблему, но мне нужно было с чего-то начать.
Определитель выдавал мне некоторые ошибки, поэтому я инициализировал его как пустой массив numpy
из 2 элементов, где первый элемент является определителем, а второй равен 0. Я немного отредактировал код с моего родного языка на английский, чтобы его можно было прочитать и понимается проще, поэтому может содержать некоторые ошибки.
Проблема в том, что когда я хочу дать пользователю право писать размер матрицы. Я проверил некоторые связанные ответы и попытался использовать map()
, raw_input()
и другие параметры, но ни один из них не сработал.
Код:
import numpy as np
from numpy.linalg import inv
from scipy.linalg import det
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
m = int(input())
n = int(input())
if rank==0:
matrix = np.zeros((m,n))
determinant = np.zeros((2))
for i in range (0,m):
for j in range(0,n):
print("Enter the value for the field: m = ", i+1, ", n = ", j+1,"\n")
matrix[i][j] = float(input())
comm.Send(matrix, dest=1, tag=0)
comm.Send(matrix, dest=2, tag=0)
comm.Recv(determinant, source=1, tag=0)
comm.Recv(matrix, source=2, tag=0)
if(determinant[0]==0):
print("There is no inverse matrix since the determinant is 0!")
else:
print("Inverse matrix:\n",matrica)
elif rank==1:
matrix = np.zeros((m,n))
determinant = np.zeros((2))
comm.Recv(matrix, source=0, tag=0)
determinant = np.array([[det(matrix)],[0]])
comm.Send(determinant, dest=0)
elif rank==2:
matrix = np.zeros((m,n))
comm.Recv(matrix, source=0, tag=0)
matrix = inv(matrix)
comm.Send(matrix, dest=0)
else:
exit()
Ошибка:
Traceback (most recent call last):
File "lambda.py", line 13, in <module>
m = int(input())
EOFError: EOF when reading a line
Traceback (most recent call last):
File "lambda.py", line 13, in <module>
m = int(input())
EOFError: EOF when reading a line
РЕДАКТИРОВАТЬ: я использую PuTTY для подключения к ОС Debian из университета.
Версия интерпретатора: sys.version_info(основная=3, второстепенная=5, микро=1, уровень выпуска='final', серийный номер=0)
Я ввожу командную строку: mpirun -np 3 python3 lambda.py, я получаю EoFError и вставляю числа до точки, где он должен что-то сделать, когда вместо этого он продолжает работать как бесконечный цикл. (Лучше видно на картинке) Изображение
Добавлен код для трассировки ввода:
m = int(input("Enter number of rows, m = \n"))
n = int(input("Enter number of columns, n = \n"))
import sys;print(sys.version_info)
- person mech   schedule 21.02.2016s = input("Enter the value for m: ")
. - person ali_m   schedule 21.02.2016EOFError
, которое вы описали в своем вопросе. Не могли бы вы обновить свой вопрос, чтобы уточнить, что происходит? - person ali_m   schedule 21.02.2016