如何用可变有限数量的元素求和?

时间:2017-04-29 11:13:36

标签: python python-3.x numpy matrix

这是我尝试使用python(以及任何编程语言)编写的第一件事,也是我在这里提出的第一个问题,所以我希望我能提供所有必要的帮助。

我有上三角矩阵,我需要求解方程组Wx = y,其中给出W(3x3矩阵)和y(向量)。我不能使用numpy.linalg函数,所以我尝试实现this,但当然是倒退。 经过几次尝试失败,我将我的任务限制在3x3矩阵。没有循环,代码如下所示:

x[0,2]=y[2]/W[2,2]
x[0,1]=(y[1]-W[1,2]*x[0,2])/W[1,1]
x[0,0]=(y[0]-W[0,2]*x[0,2]-W[0,1]*x[0,1])/W[0,0]

现在,每个新的总和包含更多元素,这些元素是原理图,但仍然需要以某种方式定义。我想在numpy中必须有sum函数,但不是linalg,它会做这样的事情,但我找不到它。 我的最新,部分"尝试"从这样的事情开始:

n=3
for k in range(n):
    for i in range(n-k-1):
        x[0,n-k-1]=y[n-k-1]/W[n-k-1,n-k-1]

当然,它只包含每个总和的第一个元素。 我会感谢任何帮助。

我正在研究的例子:

y=np.array([ 0.80064077,  2.64300842, -0.74912957])
W=np.array([[6.244998,2.88230677,-5.44435723],[0.,2.94827198,2.26990852],[0.,0.,0.45441135]]
n=W.shape[1]
x=np.zeros((1,n), dtype=np.float)

正确的解决方案应如下所示:

[-2.30857143  2.16571429 -1.64857143]

3 个答案:

答案 0 :(得分:2)

这是使用通用n和单循环

的一种方法
def one_loop(y, W, n):
    out = np.zeros((1,n))
    for i in range(n-1,-1,-1):
        sums = (W[i,i+1:]*out[0,i+1:]).sum()
        out[0,i] = (y[i] - sums)/W[i,i]
    return out

为了提高性能,我们可以用点积替换该减少量的步骤。因此,sums可以像这样计算 -

sums = W[i,i+1:].dot(x[0,i+1:])

示例运行

1)n = 3:

In [149]: y
Out[149]: array([ 5.,  8.,  7.])

In [150]: W
Out[150]: 
array([[ 6.,  6.,  2.],
       [ 3.,  3.,  3.],
       [ 4.,  8.,  5.]])

In [151]: x = np.zeros((1,3))
     ...: x[0,2]=y[2]/W[2,2]
     ...: x[0,1]=(y[1]-W[1,2]*x[0,2])/W[1,1]
     ...: x[0,0]=(y[0]-W[0,2]*x[0,2]-W[0,1]*x[0,1])/W[0,0]
     ...: 

In [152]: x
Out[152]: array([[-0.9       ,  1.26666667,  1.4       ]])

In [154]: one_loop(y, W, n=3)
Out[154]: array([[-0.9       ,  1.26666667,  1.4       ]])

2)n = 4:

In [156]: y
Out[156]: array([ 5.,  8.,  7.,  6.])

In [157]: W
Out[157]: 
array([[ 6.,  2.,  3.,  3.],
       [ 3.,  4.,  8.,  5.],
       [ 8.,  6.,  6.,  4.],
       [ 8.,  4.,  2.,  2.]])

In [158]: x = np.zeros((1,4))
     ...: x[0,3]=y[3]/W[3,3]
     ...: x[0,2]=(y[2]-W[2,3]*x[0,3])/W[2,2]
     ...: x[0,1]=(y[1]-W[1,3]*x[0,3]-W[1,2]*x[0,2])/W[1,1]
     ...: x[0,0]=(y[0]-W[0,3]*x[0,3]-W[0,2]*x[0,2]-W[0,1]*x[0,1])/W[0,0]
     ...: 

In [159]: x
Out[159]: array([[-0.22222222, -0.08333333, -0.83333333,  3.        ]])

In [160]: one_loop(y, W, n=4)
Out[160]: array([[-0.22222222, -0.08333333, -0.83333333,  3.        ]])

答案 1 :(得分:1)

还有一个问题(现在更新为Divakar在另一个答案中提供的最新技术):

import numpy as np
y=np.array([ 0.80064077,  2.64300842, -0.74912957])
W=np.array([[6.244998,2.88230677,-5.44435723],[0.,2.94827198,2.26990852],[0.,0.,0.45441135]])
n=W.shape[1]
x=np.zeros((1,n), dtype=np.float)
for i in range(n-1, -1, -1):
    x[0,i] = (y[i]-W[i,i+1:].dot(x[0,i+1:]))/W[i,i]
print(x)

给出:

[[-2.30857143  2.16571429 -1.64857143]]

答案 2 :(得分:0)

我的看法

n=3
for k in range(n):
    print("s=y[%d]"% (n-k-1))
    s = y[n-k-1]
    for i in range(0,k):
        print("s - W[%d,%d]*x[0,%d]" % (n-k-1, n-i-1, n-i-1))
        s = s - W[n-k-1,n-i-1]*x[0,n-i-1]
    print("x[0,%d] = s/W[%d,%d]" % (n-k-1,n-k-1,n-k-1))
    x[0,n-k-1] = s/W[n-k-1,n-k-1]
print(x)

且没有印刷声明

n=3
for k in range(n):
    s = y[n-k-1]
    for i in range(0,k):
        s = s - W[n-k-1,n-i-1]*x[0,n-i-1]
    x[0,n-k-1] = s/W[n-k-1,n-k-1]
print(x)

输出

s=y[2]
x[0,2] = s/W[2,2]
s=y[1]
s - W[1,2]*x[0,2]
x[0,1] = s/W[1,1]
s=y[0]
s - W[0,2]*x[0,2]
s - W[0,1]*x[0,1]
x[0,0] = s/W[0,0]
[[-2.30857143  2.16571429 -1.64857143]]