【问题标题】:How to make sum with variable finite number of elements?如何用可变有限数量的元素求和?
【发布时间】:2017-04-29 11:13:36
【问题描述】:

这是我尝试用 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]

【问题讨论】:

  • 你能给我们一个数学例子吗?
  • @ZohaibIjaz 你的意思是我关注的特定例子?我已经编辑了问题以添加它。

标签: python python-3.x numpy matrix


【解决方案1】:

这是使用通用 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.        ]])

【讨论】:

    【解决方案2】:

    再看一次(现在更新为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]]
    

    【讨论】:

      【解决方案3】:

      我的看法

      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]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多