【发布时间】:2020-07-28 22:10:36
【问题描述】:
我将如何构造一个与两个现有向量 v1 和 v2 的正交向量?
[不幸的是,stackoverflow 在这里想要更多的散文或抱怨它不符合标准。]
【问题讨论】:
标签: r orthogonal
我将如何构造一个与两个现有向量 v1 和 v2 的正交向量?
[不幸的是,stackoverflow 在这里想要更多的散文或抱怨它不符合标准。]
【问题讨论】:
标签: r orthogonal
在基数R中,给定任意两个向量,ORTHOGONAL向量可以通过以下方式获得:
a <- rbind(v1, v2)
orth.vec <- sapply(seq(ncol(a)), function(x)(-1)^(x-1)*det(a[,-x]))
如果需要对其进行归一化,即正交向量:
orth.vec/norm(orth.vec,"2")
编辑:
请注意,无论给定 n 个向量,此代码都是相同的。即a必须是维度矩阵:n x (n + 1)
例如:比较以下两个结果:
a <- matrix(sample(90),9)
MASS::Null(t(a))
[,1]
[1,] -0.16836356
[2,] -0.41335337
[3,] 0.55917161
[4,] -0.36823759
[5,] -0.16845300
[6,] 0.29331428
[7,] 0.09284215
[8,] 0.10840769
[9,] -0.13890032
[10,] 0.44547280
get_orth_vec <- function(y)sapply(seq(ncol(y)), function(x)(-1)^(x-1)*det(y[,-x]))
# Unnormalized Orthogonal Vector
orth.vec <- get_orth_vec(a)
[1] 2.418607e+15 5.937980e+15 -8.032715e+15 5.289874e+15 2.419892e+15 -4.213572e+15 -1.333713e+15
[8] -1.557318e+15 1.995356e+15 -6.399388e+15
# Orthonormal vector
orth.vec/norm(orth.vec,"2")
[1] 0.16836356 0.41335337 -0.55917161 0.36823759 0.16845300 -0.29331428 -0.09284215 -0.10840769
[9] 0.13890032 -0.44547280
请注意,两者之间的唯一区别是方向。 如果您有更大的矩阵,请使用这些包,因为它们使用 qr 分解
【讨论】:
也许你可以试试null from pracma package,例如,
vout <- pracma::null(M)
或Null 来自MASS,例如,
vout <- MASS::Null(t(M))
这样
> M%*%vout
[,1]
v1 -2.220446e-16
v2 4.440892e-16
数据
v1 <- c(1,2,3)
v2 <- c(3,2,4)
M <- rbind(v1,v2)
【讨论】:
最简单的方法可能是滥用 ols 模型:
orthogonal.vector <- resid( lm( rnorm(length(v1)) ~ v1 + v2 ) )
示例:
> v1 <- rnorm(5); v2 <- rnorm(5);
> orthogonal.vector <- resid( lm( rnorm(length(v1)) ~ v1 + v2 ) )
> orthogonal.vector %*% v1
[,1]
[1,] -0.0000000000000004441
> orthogonal.vector %*% v2
[,1]
[1,] 0.000000000000000111
【讨论】: