如何比较f#矩阵中的各个值?

时间:2014-12-12 18:57:57

标签: matrix f# f#-powerpack

我正在尝试自学f#。 对于我正在研究的程序,我想比较两个矩阵的各个元素。 矩阵的大小均为1 * N.这些是矩阵的原因是因为它们是使用标准F#PowerPack执行的先前计算的结果。我很乐意在这些计算之后将它们转换为其他集合或使用其他一些Matrix数学库。 我需要的是一个函数,它采用2个矩阵(基本上是向量)并输出一个索引位置列表,其中2个向量不相等。

例如: 输入:[[5; 6; 7; 8; 9]]; [[3; 6; 3; 8; 3]] 输出:[1; 3; 5]

我的大脑仍然以强制性的风格思考,我还没有完全理解模式匹配!

3 个答案:

答案 0 :(得分:2)

如果你使用的是Powerpack,你可以这样做:

let getDifferences x y = 
    Matrix.Generic.foldi (fun _ j s e -> if e = 0 then s else (j+1)::s) [] (x-y)
    |> List.rev // if you care about the order

通过查看示例数组,我假设您的矩阵xyint类型的通用矩阵。

如果不是这种情况,请删除.Generic并更改0的{​​{1}},但要注意comparing floats for equality可能不是一个好主意,具体取决于您的具体情况

答案 1 :(得分:1)

这适用于两个列表:

List.zip list1 list2
|> List.mapi (fun i x -> i, x)
|> List.choose (fun (i, (a, b)) -> 
    if a = b then None else Some i)

注意,返回的索引是从零开始的。

答案 2 :(得分:0)

假设您可以将这些向量提取为可以编写的集合(如果向量具有不同的大小,它将在不抛出异常的情况下工作):

let res' = ([5;6;7;8;9], [3;6;3;8;3]) 
           ||> Seq.zip 
           |> Seq.mapi (fun i (a, b) -> if a = b then None else Some (i + 1)) 
           |> Seq.choose id

我添加了1,因为mapi函数中的索引是从0开始的

如果您可以将矢量提取为列表并且矢量总是具有相同的大小,则可以使用列表函数并使用List.zip保存一行:

let res'' = ([5;6;7;8;9], [3;6;3;8;3]) 
           ||> List.mapi2 (fun i a b -> if a = b then None else Some (i + 1)) 
           |> List.choose id