当前位置:首页 > JavaScript

js实现正交

2026-01-15 13:59:05JavaScript

正交的概念

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

向量正交判断

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

js实现正交

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

生成正交向量

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

js实现正交

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));

正交矩阵验证

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

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实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现倒计时

js实现倒计时

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

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swip…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…