当前位置:首页 > 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实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js实现复选框

js实现复选框

实现复选框的基本方法 使用HTML的<input type="checkbox">元素创建复选框,并通过JavaScript监听其状态变化。 <input type="checkb…

js sort 实现

js sort 实现

数组排序基础方法 JavaScript 数组的 sort() 方法默认按照字符串 Unicode 码点顺序排序。直接调用时会将元素转为字符串再比较: const arr = [10, 2, 5, 1…