逆矩阵Python3 mpi4py EOFError:读取一行时的EOF

时间:2016-02-21 17:38:51

标签: python python-3.x numpy matrix mpi4py

我正在编写一段代码,使用mpi4py来反转矩阵。我收到的错误给了我一些问题。

我输入了2个默认变量m, n,用户将数字插入rank 0进程以填充矩阵。流程rank 0将矩阵发送到process 1process 2。在process 1中,我初始化矩阵和行列式,计算行列式,然后将其发送回rank 0。在process 2中,我初始化矩阵,找到逆矩阵,并将逆矩阵发送回过程0。

process 0中,我接收行列式和逆矩阵。如果行列式为0,则将发送消息并且程序将退出(即使行列式为0,也可以计算逆矩阵,但它不正确)。如果它不是0,程序将打印逆矩阵。

请注意,我知道当前的实现并不是并行化此问题的最佳方法,但我需要从某个地方开始。

决定因素给了我一些错误所以我把它初始化为一个由2个元素组成的空numpy数组,其中第一个元素是行列式,第二个元素是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(major = 3,minor = 5,micro = 1,releaselevel =&#39; final&#39;,serial = 0)

我输入命令行:mpirun -np 3 python3 lambda.py,我得到一个EoFError并插入数字直到它应该做的事情,而不是这样做,它继续作为无限循环运行。 (图中更好看) Picture

添加了跟踪输入的代码:

m = int(input("Enter number of rows, m = \n"))
n = int(input("Enter number of columns, n = \n"))

Picture 2

1 个答案:

答案 0 :(得分:0)

你的问题与矩阵无关:这就是你的行

{
"header":"My header",
"pages":{
    "items":[{
        "header":"My first page",
        "text":"This is my first page"
    }, {
        "header":"My second page",
        "text":"This is my second page"
    }]
  }
}

正在所有节点上发生。您需要在根节点上执行此操作,然后按照您喜欢的方式共享结果,例如广播。例如,如果我们从

开始
m = int(input())

我们得到了

from mpi4py import MPI

x = input("enter x: ")

并注意有两个错误。但如果我们保护它:

(3.5) dsm@winter:~/coding/mpipar$ mpirun -np 3 python m1.py
enter x: enter x: Traceback (most recent call last):
  File "m1.py", line 3, in <module>
    x = input("enter x: ")
EOFError: EOF when reading a line
enter x: Traceback (most recent call last):
  File "m1.py", line 3, in <module>
    x = input("enter x: ")
EOFError: EOF when reading a line

然后我们得到

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

x = None
if rank == 0:
    x = input("enter x: ")

x = comm.bcast(x, root=0)

print("rank", rank, "thinks x is", x)