当前位置:首页 > 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实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: cons…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…