【问题标题】:easiest way to construct an orthogonal vector in R [closed]在R中构造正交向量的最简单方法[关闭]
【发布时间】:2020-07-28 22:10:36
【问题描述】:

我将如何构造一个与两个现有向量 v1v2 的正交向量?

[不幸的是,stackoverflow 在这里想要更多的散文或抱怨它不符合标准。]

【问题讨论】:

标签: r orthogonal


【解决方案1】:

在基数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 分解

【讨论】:

  • 自制食谱的好答案,+1!
【解决方案2】:

也许你可以试试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)

【讨论】:

    【解决方案3】:

    最简单的方法可能是滥用 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
    

    【讨论】:

    • 从技术上讲,这并不完全正确。 c(0,0,0) 是原点而不是正交向量
    • 请详细说明。结果不是原点。
    • 因为你是随机生成的,但是残差需要为零。如果模型完美拟合,则残差为零。再试一次
    • 知道了。但是,对于随机绘制的 y 向量,s 完全拟合模型 y 是零概率事件。在这种情况下,可以用另一个随机绘制的向量重做。
    • 我尝试了 5 次,所有这些我得到的残差都是 c(0,0,0)。这不是正交向量
    猜你喜欢
    • 2015-02-11
    • 2018-03-03
    • 1970-01-01
    • 2017-05-13
    • 2014-10-28
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多