当前位置:首页 > JavaScript

js实现正交

2026-01-15 13:59:05JavaScript

正交的概念

正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。

向量正交判断

判断两个向量是否正交可以通过点积是否为0来实现:

function isOrthogonal(v1, v2) {
  if (v1.length !== v2.length) return false;
  let dotProduct = 0;
  for (let i = 0; i < v1.length; i++) {
    dotProduct += v1[i] * v2[i];
  }
  return Math.abs(dotProduct) < 1e-10; // 考虑浮点误差
}

// 示例用法
const vector1 = [1, 0];
const vector2 = [0, 1];
console.log(isOrthogonal(vector1, vector2)); // true

生成正交向量

给定一个向量,可以生成与之正交的向量:

function generateOrthogonalVector(v) {
  if (v.length < 2) return null;
  const orthogonal = [...v].reverse();
  orthogonal[0] = -orthogonal[0];
  return orthogonal;
}

// 示例
const vector = [1, 2];
console.log(generateOrthogonalVector(vector)); // [-2, 1]

正交化过程(Gram-Schmidt)

对一组向量进行正交化处理:

function gramSchmidt(vectors) {
  const basis = [];

  for (const v of vectors) {
    let w = [...v];
    for (const b of basis) {
      const projection = scalarProjection(v, b);
      w = vectorSubtract(w, vectorScale(b, projection));
    }
    basis.push(normalize(w));
  }

  return basis;
}

function scalarProjection(a, b) {
  return dotProduct(a, b) / dotProduct(b, b);
}

function dotProduct(a, b) {
  return a.reduce((sum, _, i) => sum + a[i] * b[i], 0);
}

function vectorSubtract(a, b) {
  return a.map((val, i) => val - b[i]);
}

function vectorScale(v, scalar) {
  return v.map(x => x * scalar);
}

function normalize(v) {
  const mag = Math.sqrt(dotProduct(v, v));
  return v.map(x => x / mag);
}

// 示例
const vectors = [[1, 1], [1, 0]];
console.log(gramSchmidt(vectors));

正交矩阵验证

验证一个矩阵是否为正交矩阵:

js实现正交

function isOrthogonalMatrix(matrix) {
  const n = matrix.length;
  // 检查矩阵是否为方阵
  if (matrix.some(row => row.length !== n)) return false;

  // 计算矩阵与其转置的乘积
  const product = new Array(n).fill().map(() => new Array(n).fill(0));

  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      for (let k = 0; k < n; k++) {
        product[i][j] += matrix[i][k] * matrix[j][k];
      }
    }
  }

  // 检查是否为单位矩阵
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      const expected = i === j ? 1 : 0;
      if (Math.abs(product[i][j] - expected) > 1e-10) {
        return false;
      }
    }
  }

  return true;
}

// 示例
const orthogonalMatrix = [
  [Math.cos(30), -Math.sin(30)],
  [Math.sin(30), Math.cos(30)]
];
console.log(isOrthogonalMatrix(orthogonalMatrix));

正交应用场景

  1. 计算机图形学中的坐标变换
  2. 机器学习中的特征提取
  3. 信号处理中的正交分解
  4. 密码学中的正交编码
  5. 优化算法中的正交方向搜索

以上实现涵盖了正交相关的常见操作,可以根据具体需求进行调整和扩展。

标签: 正交js
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…