Matrix矩阵开发实战经验分享那些年我踩过的坑和学到的核心技术

FSD-瑞君 工具 阅读 1,830
赞 66 收藏
二维码
手机扫码查看
反馈

又踩坑了,Matrix矩阵计算出错

今天在搞一个项目的时候,碰到了一个关于Matrix矩阵计算的问题。本来以为是个简单的矩阵乘法,结果发现算出来的结果总是不对。折腾了半天,最后发现是数据类型的问题。

Matrix矩阵开发实战经验分享那些年我踩过的坑和学到的核心技术

排查过程,试了几种方法都没用

一开始我用的是JavaScript自带的Array来存储矩阵,然后写了个简单的函数来做矩阵乘法。代码如下:

function matrixMultiply(a, b) {
  const result = new Array(a.length).fill(0).map(() => new Array(b[0].length).fill(0));
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < b[0].length; j++) {
      for (let k = 0; k < b.length; k++) {
        result[i][j] += a[i][k] * b[k][j];
      }
    }
  }
  return result;
}

测试了一下,发现结果总是不对。我以为是自己算法写错了,就去查了查别人的实现,发现都差不多。然后我就怀疑是不是数据本身有问题,检查了好几遍,确认数据没问题。后来试了下发现,原来是数据类型的问题。我的矩阵里有些元素是字符串类型,而不是数字类型。

核心代码就这几行,解决数据类型问题

为了解决这个问题,我加了个转换数据类型的步骤。具体做法是,在做矩阵乘法之前,先把所有元素都转成数字类型。代码如下:

function parseMatrix(matrix) {
  return matrix.map(row => row.map(item => parseFloat(item)));
}

function matrixMultiply(a, b) {
  a = parseMatrix(a);
  b = parseMatrix(b);
  const result = new Array(a.length).fill(0).map(() => new Array(b[0].length).fill(0));
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < b[0].length; j++) {
      for (let k = 0; k < b.length; k++) {
        result[i][j] += a[i][k] * b[k][j];
      }
    }
  }
  return result;
}

这样改完之后,再测试一下,结果就对了。这里我踩了个坑,以后处理这种数据的时候一定要注意数据类型的问题。

为什么会出现这个问题,说说我的理解

其实这个问题出现的原因很简单,就是字符串和数字相乘的时候,结果会变成NaN(Not a Number)。比如"1" * "2"的结果不是2,而是NaN。所以必须先把所有的元素都转成数字类型,才能正常进行矩阵乘法。

还有一点要注意的是,使用parseFloat可以处理一些带小数的情况,比如"1.5"。如果只用parseInt,那么"1.5"就会被转成1,而不是1.5。所以为了保证精度,还是用parseFloat比较好。

总结一下,以上是我踩坑后的总结

这次遇到的问题其实挺常见的,就是数据类型不一致导致的计算错误。处理矩阵的时候,一定要确保所有元素都是数字类型。希望这个经验能对你有帮助,如果你有更好的解决方案,欢迎在评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论