JavaScript一维转二维数组方法及皮尔逊相关矩阵赋值报错排查
解决一维数组转二维数组及皮尔逊相关矩阵赋值错误问题
Hey,我来帮你搞定这两个问题——先解决你代码里的报错,再给你讲通用的一维数组转二维数组的方法~
一、先修复你的皮尔逊矩阵代码错误
错误原因拆解
你碰到的Uncaught TypeError: Cannot set property '0' of undefined,核心有两个问题:
- 矩阵初始化不完整:你定义
var r = [[]];时,只创建了第一行的空数组,当循环到第2行(i=2)时,r[1]是undefined,自然没法给r[1][0]赋值。 - 运算符用错:
_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
相关产品推荐
相关产品推荐

