2017-12-18 271 views
0

我正在尝试使用函数式编程来编写以下函数。如何在python中使用矩阵和向量的reduce/lambda函数?

def mv(A,X,n): 
    Y = [0]*n 
    for i in range(n): 
     for j in range(n): 
      Y[i] += A[i][j] * X[j] 
    return Y 

减法函数可以将一个向量乘以一个矩阵吗?因为这是我在这里要做的。我正在尝试将矩阵A与矢量X相乘,但收到错误。错误是:

TypeError: 'function' object is not iterable

def mv(A,X,n): 
    return list(map(sum,lambda x, y: x*y(A, X))) 

要输入:

A = [[1,2],[3,4]] 
X = [1,2] 
n = 2 
print(mv(A,X,n)) 

输出应该是:

[5,11] 
+0

什么错误你得到? –

+0

TypeError:'函数'对象不可迭代 – ce1

+0

正如所料。 'map'的第二个参数是一个可迭代的非函数,所以你必须通过你的列表而不是'lambda' –

回答

1

使用列表推导这里有一个快速和肮脏的解决方案,如果你想要坚持功能结构(在map和之上的Python中受到理解):

import operator as op 
x = [[1],[2],[3]] # Notice the dimensions! 
A = [[1,1,1], 
    [2,2,2], 
    [3,3,3]] 

def matrix_mult(A, X): 
    return [ 
     [sum(map(op.mul, row, col)) for col in zip(*X)] 
     for row in A 
    ] 

在行动中看到:

In [17]: A 
Out[17]: [[1, 1, 1], [2, 2, 2], [3, 3, 3]] 

In [18]: x 
Out[18]: [[1], [2], [3]] 

In [19]: matrix_mult(A, x) 
Out[19]: [[6], [12], [18]] 
+0

我是否在搞东西? - https://eval.in/921279 – splash58

+0

@ splash58对不起,什么? –

+0

eval上的代码看起来更容易,不需要改变向量和结果的结构。但我不使用python,所以可能不知道你为什么选择另一种方式 – splash58

相关问题