js实现正交
正交的概念
正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。
向量正交判断
判断两个向量是否正交可以通过点积是否为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));
正交矩阵验证
验证一个矩阵是否为正交矩阵:
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));
正交应用场景
- 计算机图形学中的坐标变换
- 机器学习中的特征提取
- 信号处理中的正交分解
- 密码学中的正交编码
- 优化算法中的正交方向搜索
以上实现涵盖了正交相关的常见操作,可以根据具体需求进行调整和扩展。





