我正在尝试自学f#。 对于我正在研究的程序,我想比较两个矩阵的各个元素。 矩阵的大小均为1 * N.这些是矩阵的原因是因为它们是使用标准F#PowerPack执行的先前计算的结果。我很乐意在这些计算之后将它们转换为其他集合或使用其他一些Matrix数学库。 我需要的是一个函数,它采用2个矩阵(基本上是向量)并输出一个索引位置列表,其中2个向量不相等。
例如: 输入:[[5; 6; 7; 8; 9]]; [[3; 6; 3; 8; 3]] 输出:[1; 3; 5]
我的大脑仍然以强制性的风格思考,我还没有完全理解模式匹配!
答案 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
通过查看示例数组,我假设您的矩阵x
和y
是int
类型的通用矩阵。
如果不是这种情况,请删除.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