【问题标题】:F# match with for matrixF# 匹配矩阵
【发布时间】:2011-11-17 16:08:43
【问题描述】:

我想使用“匹配”函数来比较两个矩阵。 我想我对这个功能不太了解。 让我们举一个简单的例子。考虑 2 个简单的矩阵:

let a  = matrix [[1.0; 1155.0; 1.0]
                 [1.0; 1156.0; 1.0]
                 [2.0; 1157.0; 1.0]
                 [3.0; 1157.0; 1.0]]
let b  = matrix [[1.; 0.; 1.0]
                 [1.0; 0.; 1.0]
                 [2.0; 0.; 1.0]
                 [3.0; 0.; 1.0]]

现在我想将矩阵“a”的第二列复制到矩阵“b”中。但是使用下面的代码,我有错误说 "error FS0010: unexpected symbole '[' in the expression.use '(', '()' ..."*. 这是代码:

for i = 0 to a.NumCols -1 do
    match b.[i,0] with
    | a.[i,0] -> (b.[i,1]<-a.[i,1])
    | _ -> (b.[i,1]<-a.[i,1])

问题似乎来自无法识别或意外的 a.[i,0]。我不明白为什么我只是要求将一个浮点数(b.[i,0])与另一个浮点数(a.[i,0])匹配。 能给我解释一下吗?

【问题讨论】:

    标签: f# matrix pattern-matching


    【解决方案1】:

    我认为match 关键字在这种情况下没有用。仅当您需要根据某个表达式的值执行不同的操作时,这才有用。您可以通过以下方式轻松解决问题:

    b.[0 .. b.NumCols, 1 .. 1] <- a.[0 .. b.NumCols, 1 .. 1] 
    

    这将执行批量操作 - 它采用一个表示a 的整个第二列的切片,并将其分配给一个表示b 的整个第二列的切片。

    如果您想使用for 循环编写此代码,您可以使用:

    for i in 0 .. b.NumCols - 1 do 
      b.[i, 1] <- a.[i, 1]
    

    有关使用matrix 类型的更多信息,您可以阅读my recent blog post。它使用matrix 来表示图形,但它解释了您可以对矩阵执行的所有基本语法和操作。

    EDIT 要回答附加问题 - 如果要检查匹配值是否与其他值相同(例如另一个矩阵中的元素),则需要使用 @987654330 @子句:

    match a.[0,0] with
    | v when v = b.[0,0] -> () // Do nothing, they are the same
    | v -> a.[0,0] <- v        // Set a.[0,0] to b.[0,0] because they are different
    

    【讨论】:

    • 确实我的例子很简单,但我在更复杂的算法中使用了模式匹配。而且我不明白为什么在这个“匹配”代码中不能识别 a.[i,0] 。似乎你只能写一个浮点数,如“i”或 10 或任何东西,但不能写矩阵的元素......你有什么解释吗?顺便说一句非常好的博客
    • @fabco63 我编辑了我的答案以添加解释 - 你只能将值与模式匹配 - 如果你想用表达式测试是否相等,你需要 when
    • 再次感谢你,Thomas 太完美了。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2021-12-29
    • 2012-01-28
    相关资源
    最近更新 更多