Matrix 如何使用SML NJ确定矩阵是否为单位矩阵?

Matrix 如何使用SML NJ确定矩阵是否为单位矩阵?,matrix,sml,pseudocode,Matrix,Sml,Pseudocode,我不熟悉这种语言,我觉得这有点让人困惑。你能帮我做这个吗? 到目前为止,我只有一个伪代码。请你帮我解释一下语法好吗 矩阵的每一行将是一个列表,参数将是列表列表 function (list of lists) = if (matrix is null) then false else if (unit matrix with element 1) then true else add all the lists and g

我不熟悉这种语言,我觉得这有点让人困惑。你能帮我做这个吗? 到目前为止,我只有一个伪代码。请你帮我解释一下语法好吗

矩阵的每一行将是一个列表,参数将是列表列表

function (list of lists) = 
    if (matrix is null) then
        false
    else if (unit matrix with element 1) then
        true
    else
        add all the lists and get a list with the lenght of number of lists
        check if each element is 2
        if (2) then
            true
        else false

在SML中,列表列表不是处理矩阵的最佳选择,但编写一个函数来检查列表列表是否为单位矩阵仍然是一个很好的练习

递归方法是自然的。下图:

请注意:

第一行的第一个元素是1 该行的其余部分都是0 第一列的其余部分都是0 阴影区域右下方矩阵的其余部分本身就是一个单位矩阵。 作为预备,编写一个函数来测试列表是否全部为0。您可以使用标准的基函数来实现这一点,尽管您可以很容易地使用自己的基函数:

fun all_zeros [] = true
|   all_zeros (x::xs) = x = 0 andalso all_zeros xs
主功能检查上述4点。必须注意各种基本情况。空列表不是标识矩阵。也不是空列表的列表。最后一种情况很容易忽略,但如果向函数传递一个行数大于列数的矩阵,则会在行数之前用完列数。我将hd映射到底部行,以提取左上角元素下面第1列的其余部分,并将tl映射到底部行,以获取矩阵的右下部分,从而递归地反馈到函数中。这可能会生成空列表的非空列表,因此必须检查:

fun id_matrix [] = false
|   id_matrix (row::[]) = (row = [1])
|   id_matrix ([]::rows) = false
|   id_matrix (row::rows) = 
    let
       val x :: xs = row
    in
       x = 1 andalso 
       all_zeros(xs) andalso 
       all_zeros(map hd rows) andalso 
       id_matrix(map tl rows)
    end

最后,我的代码假设列表列表代表一个有效数组,只检查它是否是标识。传递一个参差不齐的数组而不是矩阵可能会使它崩溃。添加一个复选框是很容易的,不过这会使代码更加繁琐。

可能会在欧洲时间晚些时候返回以获得答案,但是现在,如何为矩阵使用合适的类型?二维数组可能是匹配项:。然后先检查矩阵是否为正方形。为Kronecker delta写一个函数:然后检查M_i,j是否等于kroneckeri,j。我知道这是一个老问题,但我认为在我最喜欢的SO标记中找到一些老但有趣的未回答问题会很有趣。