【问题标题】:How can I form matrix lines programmaticaly based on an element list?如何根据元素列表以编程方式形成矩阵线?
【发布时间】:2021-04-09 20:58:43
【问题描述】:

我正在练习一些编程逻辑,有一个朋友与我分享的挑战。问题来了:

编写一个脚本,取整数 n 作为矩阵的行数和列数,并取矩阵的元素列表。

Example: n=3 
      matrix = [[11 2 4],
                 [4 5 6],
                 [10 8 -12] ]

并将矩阵的行列式打印为 -100

到目前为止我的解决方案、代码、问题、问题:

解决方案

创建一个有n个空位置的数组,将来这些位置将存储其他数组,它们将是矩阵的每一行。

遍历每个空白位置以填充新的矩阵线

在循环内创建一个变量,该变量将是带有元素的矩阵行

循环元素列表以获取一行的必要元素

将带有元素的矩阵行放在最终矩阵上

代码

    function createMatrix(rowsAndColumns, elementsList) {
        const finalMatrix = Array(rowsAndColumns)
    
        for(let i = 0; i < finalMatrix.length; i++) {
            let matrixLineWithElements = []
            for(let k = 0; k < rowsAndColumns; k++) {
                matrixLineWithElements[k] = elementsList[k]
         }
            finalMatrix[i] = matrixLineWithElements
         }
    }

问题

您可能已经在代码中注意到,我从列表中提取相同的元素来形成一行。最终矩阵成功形成,但我不知道如何计算每行不同的值,这是我终端的图像:

问题

我不再试图弄清楚 while 代码并做了以下笔记 -

如果我有一个包含四个元素的列表:

[10. 90, 100, 25]

我会形成一个2X2的矩阵,所以我需要对列表的元素进行计数。

0(零)和2是计数的起点,计数盐为2(n变量的值相同)。

这里有某种模式,看,如果我有一个 9 元素列表,比如

[10, 90, 100, 25, 36, 48, 2, 5, 6]

我会形成一个3X3的矩阵,所以我需要对列表的元素进行计数。

0(零),3和6是计数的起点,计数盐为3(n变量的值相同)。

如何以编程方式进行计数?

我对这个问题的方法和思考是否有意义或有更好的方法?

【问题讨论】:

    标签: javascript node.js matrix logic


    【解决方案1】:

    举个例子

    Col 0 Col 1
    Row 0 0 1
    Row 1 2 3
    Col 0 Col 1 Col 2
    Row 0 0 1 2
    Row 1 3 4 5
    Row 2 6 7 8

    这些是 2 个“矩阵”,其中的单元格填充了要放置在其中的 elementsList 元素的索引。

    您可以看到,对于“第 0”行,列号是索引,但对于第一行,它是列索引,增加了第一行中的元素数。 在第二行中,列索引增加了行长的 2 倍(或者如果我们使用第二版代码 - 使用计数器,则增加已放置的元素数量)。

    我们可以推断出第 n 行索引从 n*(行长)开始,并像列索引一样增加一,因此矩阵单元格中 elementsList 索引的公式:(row number) * (length of row) + columnn index

    function createMatrix(rowsAndColumns, elementsList) {
      const finalMatrix = Array(rowsAndColumns)
    
      for(let i = 0; i < finalMatrix.length; i++) {
          let matrixLineWithElements = []
          for(let k = 0; k < rowsAndColumns; k++) {
              matrixLineWithElements[k] = elementsList[k+i*finalMatrix.length] // here you just needed to add i times (max i)
       }
          finalMatrix[i] = matrixLineWithElements
       }
       return finalMatrix // I added this only so that it can be printed
    }
    console.log(createMatrix(2,[1,2,3,4]))

    其他选项:

    function createMatrix(rowsAndColumns, elementsList) {
      const finalMatrix = Array(rowsAndColumns)
      let counter = 0 // Added counter
      for(let i = 0; i < finalMatrix.length; i++) {
          let matrixLineWithElements = []
          for(let k = 0; k < rowsAndColumns; k++) {
              matrixLineWithElements[k] = elementsList[counter] 
              counter+=1 // Increment counter
       }
          finalMatrix[i] = matrixLineWithElements
       }
       return finalMatrix // I added this only so that it can be printed
    }
    console.log(createMatrix(2,[1,2,3,4]))

    但是,我不喜欢改变变量

    function createMatrix(n, elementsList) {
          const range = (length) => [...Array(length).keys()]
          const finalMatrix = range(n).map((i) =>
            range(n).map((j) =>
              elementsList[i * n + j]
          ))
           return finalMatrix // I added this only so that it can be printed
        }
        console.log(createMatrix(2,[1,2,3,4]))

    【讨论】:

    • 谢谢@Vulwsztyn。现在我要研究每一种方法,首先,你能解释一下如何得到-k+i*finalMatrix.length。我的意思是,我知道你是在对索引求和并乘以最终的矩阵长度,但是你怎么知道它可以工作,你怎么想的?
    • 我已经做了很多次了,它很自然,但我会尝试通过编辑答案来解释。
    • 很好的解释,直截了当,我无法理解。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2020-04-30
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多