2015-10-16 50 views
0

我试图在F#中编写一个函数,用于将2个矩阵相乘。它使用转置函数来查找给定矩阵的转置。F#中的乘法函数总是返回failwith

let rec transpose = function 
    | [] -> failwith "Error, no matrix supplied" 
    | xs when List.head xs = [] -> [] 
    | xs -> List.map (fun n -> List.head n) xs :: transpose 
      (List.map(fun n -> List.tail n) xs);; 



let rec multiply = function 
    |([], []) -> [] 
    |([], ys) -> failwith "Empty matrix" 
    |(xs, []) -> failwith "empty matrix" 
    |(x::xs, ys) -> let t = transpose ys 
        List.map(fun n -> inner x n) t :: multiply(xs,ys);; 

不管输入的是什么,我的乘法函数始终执行“failwith”假如我跟[0]然而,代替failwith,功能完美的作品返回。但是当我将一个矩阵与一个空矩阵相乘时,我觉得0是不正确的,所以我想解决这个问题,并且如果是这样的话能够输出错误。

+0

不知道你的应用是什么,但MathNet.Numerics拥有出色的线性代数库,可与英特尔数学核心函数中使用用于快速矩阵操作的库。 http://numerics.mathdotnet.com/ – mpeac

回答

3

你的问题出在递归 - 你这样做:

multiply(xs,ys) 

这会发生,直到xs=[]时,你会得到一个失败。

最好的解决方案可能是有包装的功能 - 像

let multiply a b = 
    check a 
    check b 
    let rec actualmultiply = ... 
    actualmultiply a b