You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript一维转二维数组方法及皮尔逊相关矩阵赋值报错排查

解决一维数组转二维数组及皮尔逊相关矩阵赋值错误问题

Hey,我来帮你搞定这两个问题——先解决你代码里的报错,再给你讲通用的一维数组转二维数组的方法~

一、先修复你的皮尔逊矩阵代码错误

错误原因拆解

你碰到的Uncaught TypeError: Cannot set property '0' of undefined,核心有两个问题:

  1. 矩阵初始化不完整:你定义var r = [[]];时,只创建了第一行的空数组,当循环到第2行(i=2)时,r[1]是undefined,自然没法给r[1][0]赋值。
  2. 运算符用错:_arrData[0].length^2是按位异或运算,不是平方!平方得用Math.pow(_arrData[0].length, 2)或者ES6的**(比如4**2得到16)。而且完全没必要倒着取r_temp的元素,按顺序填充更直观。

修正后的完整代码

const arrayColumn = (arr, n) => arr.map(x => x[n]);
const pcorr = (x, y) => {
  let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumY2 = 0;
  // 不要修改原数组的length,用变量存最小长度更安全
  const minLength = Math.min(x.length, y.length);
  const reduce = (xi, idx) => {
    if (idx >= minLength) return; // 只处理到两个数组都有的元素
    const yi = y[idx];
    sumX += xi;
    sumY += yi;
    sumXY += xi * yi;
    sumX2 += xi * xi;
    sumY2 += yi * yi;
  }
  x.forEach(reduce);
  return (minLength * sumXY - sumX * sumY) / Math.sqrt((minLength * sumX2 - sumX * sumX) * (minLength * sumY2 - sumY * sumY));
};

// 创建皮尔逊相关矩阵
const colCount = _arrData[0].length; // 你的数据是4列,这里会得到4
let r = [];
const r_temp = [];

// 生成一维相关系数数组
for (let i = 1; i <= colCount; i++) {
  for (let j = 1; j <= colCount; j++) {
    r_temp.push(pcorr(arrayColumn(_arrData, i-1), arrayColumn(_arrData, j-1)));
  }
}

// 把一维数组转为4×4二维矩阵(直观写法)
let currentIndex = 0;
for (let i = 0; i < colCount; i++) {
  r[i] = []; // 先创建当前行的空数组
  for (let j = 0; j < colCount; j++) {
    r[i][j] = r_temp[currentIndex++];
  }
}

二、通用的一维数组转二维数组方法

如果以后需要在其他场景下转换,推荐封装一个通用函数,复用性更强:

/**
 * 将一维数组转为指定每行长度的二维数组
 * @param {Array} oneDArray - 输入的一维数组
 * @param {number} rowItemCount - 每行要放的元素数量
 * @returns {Array} 转换后的二维数组
 */
const convert1DTo2D = (oneDArray, rowItemCount) => {
  const result = [];
  for (let i = 0; i < oneDArray.length; i += rowItemCount) {
    // 从当前索引截取rowItemCount个元素作为一行
    result.push(oneDArray.slice(i, i + rowItemCount));
  }
  return result;
};

// 对你的场景,直接调用就行:
const r = convert1DTo2D(r_temp, colCount);

额外小优化

原pcorr函数里的x.length = y.length = Math.min(x.length, y.length)会直接修改传入的原数组长度,这可能会影响后续对原数组的使用。我在修正代码里改成了用minLength判断索引,避免修改原数组,这样代码更安全。

内容的提问来源于stack exchange,提问作者Rendy Eza Putra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:18