如何求解一个非常大的超定线性方程组?

时间:2015-05-08 15:00:18

标签: matlab scipy linear-algebra sparse-matrix numerical-methods

我正在做一个关于图像处理的项目,我需要解决以下方程组:

Nx+Nz*( z(x+1,y)-z(x,y) )=0  
Ny+Nz*( z(x+1,y)-z(x,y) )=0  

和边界的方程(图像的底部和右侧):

Nx+Nz*( z(x,y)-z(x-1,y) )=0  
Ny+Nz*( z(x,y)-z(x,y-1) )=0  

其中Nx,Ny,Nz是相应坐标处的表面法向量,​​并且已经确定。现在的问题是因为(x,y)是图像上的坐标,其通常具有x = 300和y = 200的尺寸。所以有300x200 = 60000个未知数。我以Mz = b的形式重写方程,其中M的大小为120,000x60000,z和b都是长度为60000的向量。当我使用python scipy.linalg.lstsq中的函数解决它时,我遇到了记忆错误 我注意到M非常稀疏,因为它每行只有两个非零条目,分别为1或-1。但是,我不知道如何利用它来解决问题。任何想法如何在matlab或python中更有效地解决它?

在python中,我找到了一个具有lsmr方法的库(如评论中某人所述)。除了使用该算法求解方程Mx = b之外,我想知道是否需要以稀疏格式存储M和B.现在我只是创建一个非常大的数组,开头所有条目都为零,然后我使用for循环遍历每个像素并将相应的条目更改为1或-1。然后我应用lsmr直接解决Mx = b。如果我在sparse format中的任何一个中构造矩阵M和b,它会有帮助吗?现在大部分时间花在解决Mx = b上。与求解Mx = b相比,构造数组M,b并且执行所有先前的任务所花费的时间可以忽略不计。

感谢

编辑:这是我用来生成矩阵M和b的python代码。它们应该是正确的,但不确定是否有其他更好的方法来重写线性方程组。

eq_no = 0
for pix in range(total_pix):
    row, col = y[pix], x[pix]

    if index_array[row,col] >= 0: # confirm (x,y) is inside boundary
        # check x-direction
        if index_array[row,col+1] >= 0: # (x+1,y) is inside boundary
            M[eq_no,pix] = -1
            M[eq_no,pix+1] = 1
            b[eq_no,0] = -normal_array[row,col,0]/normal_array[row,col,2]
            eq_no += 1

        # check y-direction
        next_pix = index_array[row+1,col]
        if next_pix >= 0:
            M[eq_no , pix] = -1
            M[eq_no , next_pix] = 1
            b[eq_no,0] = -normal_array[row,col,1]/normal_array[row,col,2]
            eq_no += 1

0 个答案:

没有答案