2017-12-18 270 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

相關問題