目录
注:本博文为本人阅读论文、文章后的原创笔记,未经授权不允许任何转载或商用行为,否则一经发现本人保留追责权利。有问题可留言联系,欢迎指摘批评,共同进步!!!
问 :以三维情况为例,已知三个线性无关的向量
a
\mathbf{a}
a、
b
\mathbf{b}
b、
c
\mathbf{c}
c,如何能找到三个正交向量
α
1
\bm{\alpha_1}
α1、
α
2
\bm{\alpha_2}
α2、
α
3
\bm{\alpha_3}
α3,在归一化后能形成标准正交基:
e
1
\mathbf{e_1}
e1、
e
2
\mathbf{e_2}
e2、
e
3
\mathbf{e_3}
e3 ?
公式:
- 对三个线性无关的向量 a \mathbf{a} a、 b \mathbf{b} b、 c \mathbf{c} c进行Gram-Schmidt正交化,所得的正交向量 α 1 \bm{\alpha_1} α1、 α 2 \bm{\alpha_2} α2、 α 3 \bm{\alpha_3} α3分别为:
α 1 = a α 2 = b − b α 1 ∣ α 1 ∣ 2 α 1 α 3 = c − c α 1 ∣ α 1 ∣ 2 α 1 − c α 2 ∣ α 2 ∣ 2 α 2 \begin{aligned} \bm{\alpha_1} &= \mathbf{a} \\ \bm{\alpha_2} &= \mathbf{b}-\frac{\mathbf{b} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1} \\ \bm{\alpha_3} &= \mathbf{c}-\frac{\mathbf{c} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{c} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \end{aligned} α1α2α3=a=b−∣α1∣2b α1 α1=c−∣α1∣2c α1 α1−∣α2∣2c α2 α2- 对 n n n个线性无关的向量 a \mathbf{a} a、 b \mathbf{b} b、 ⋯ \cdots ⋯、 x \mathbf{x} x进行Gram-Schmidt正交化,所得的正交向量 α 1 \bm{\alpha_1} α1、 α 2 \bm{\alpha_2} α2、 ⋯ \cdots ⋯、 α n \bm{\alpha_n} αn分别为:
α 1 = a α 2 = b − b α 1 ∣ α 1 ∣ 2 α 1 α 3 = c − c α 1 ∣ α 1 ∣ 2 α 1 − c α 2 ∣ α 2 ∣ 2 α 2 ⋮ α n = x − x α 1 ∣ α 1 ∣ 2 α 1 − x α 2 ∣ α 2 ∣ 2 α 2 − ⋯ − x α n − 1 ∣ α n − 1 ∣ 2 α n − 1 \begin{aligned} \bm{\alpha_1} &= \mathbf{a} \\ \bm{\alpha_2} &= \mathbf{b}-\frac{\mathbf{b} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1} \\ \bm{\alpha_3} &= \mathbf{c}-\frac{\mathbf{c} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{c} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \\ \vdots \\ \bm{\alpha_n} &= \mathbf{x}-\frac{\mathbf{x} \ \bm{\alpha_1}}{|\bm{\alpha_1}|^2} \ \bm{\alpha_1}-\frac{\mathbf{x} \ \bm{\alpha_2}}{|\bm{\alpha_2}|^2} \ \bm{\alpha_2} \ - \ \cdots - \ \frac{\mathbf{x} \ \bm{\alpha_{n-1}}}{|\bm{\alpha_{n-1}}|^2} \ \bm{\alpha_{n-1}} \end{aligned} α1α2α3⋮αn=a=b−∣α1∣2b α1 α1=c−∣α1∣2c α1 α1−∣α2∣2c α2 α2=x−∣α1∣2x α1 α1−∣α2∣2x α2 α2 − ⋯− ∣αn−1∣2x αn−1 αn−1
公式解读:在使用第n个向量计算第n个正交向量时,只要在第n个向量中排除掉前(n-1)个正交向量的组分,就能得到第n个正交向量。
具体推导的图解请参看知乎回答。
将非正交基转为正交基,便于表示。
通俗来说,就是将一对歪歪斜斜的基向量掰成标准正交基。(强迫症)
Gram-Schmidt公式推到中的方法是纯数的方法,但是在数值运算方法中(计算机操作)不会严格按照数学方法来。具体如下所述。

由此,我们看拿出Modified G-S的思想是:
使用第k个线性无关向量组的向量 w k \mathbf{w_k} wk计算第k个正交基 u k \mathbf{u_k} uk时,就是在 w k \mathbf{w_k} wk中排除掉前 k − 1 k-1 k−1个正交基的组分,剩余的就是 u k \mathbf{u_k} uk的组分,再除以系数即可。

为了解决这一问题,就有了Stable Gram-Schmidt算法(SGS)。
不同于Modified Gram-Schmidt,SGS算法的核心思想是:
每使用一个线性无关组向量
w
k
\mathbf{w_k}
wk求出一个单位正交基向量
u
k
\mathbf{u_k}
uk,那么剩余的
w
k
+
1
\mathbf{w_{k+1}}
wk+1到
w
L
\mathbf{w_L}
wL这些向量都要立即原地减去其中所含的
u
k
\mathbf{u_k}
uk组分,进行更新。
每计算出一个新的单位正交基向量,就当场把剩余线性无关组向量中的此组分排除掉

与3.1中的问题一致,使用SGS可以抵消微小误差的影响,算法更具有鲁棒性。

我们注意到,使用两种算法计算所得的 u 3 \mathbf{u_3} u3向量时不同的,因此着重比较一下两算法计算 u 3 \mathbf{u_3} u3时的差别:( u 3 = v 3 ∣ ∣ v 3 ∣ ∣ 2 \mathbf{u_3} = \frac{\mathbf{v_3}}{||\mathbf{v_3}||_2} u3=∣∣v3∣∣2v3)
从理论上讲, u 1 \mathbf{u_1} u1与 u 2 \mathbf{u_2} u2是要正交的,因此 u 2 T u 1 = 0 \mathbf{u_2^Tu_1}=0 u2Tu1=0,最后多出的这一项在理论上就是不存在了。
但是在数值计算(计算机运算)时候存在一定的误差,此时最后这一项不再为0,它的存在也有助于保证在误差存在情况下的稳定性。
这一项在理论上不存在,但实际上有利于保持stability.
在一个 k k k维空间中,我们已知了 k − 1 k-1 k−1个单位正交基向量 u 1 \mathbf{u_1} u1、 u 2 \mathbf{u_2} u2、 ⋯ \cdots ⋯、 u k − 1 \mathbf{u_{k-1}} uk−1,这些正交基列向量组成一个矩阵 A \mathbf{A} A={ u 1 u 2 ⋯ u k − 1 \mathbf{u_1} \ \mathbf{u_2} \ \cdots \ \mathbf{u_{k-1}} u1 u2 ⋯ uk−1}。此外,还已知一个在 k k k维上都有分量的向量 w \mathbf{w} w。问:如何找到第 k k k个单位正交基向量 u k \mathbf{u_k} uk呢?
实际上,要找到这最后一个正交向量,我们只需要排除掉向量
w
\mathbf{w}
w中所含有的前(
k
−
1
k-1
k−1)个单位正交向量组分即可。因此,我们可以找一个系数向量
x
\mathbf{x}
x,其中包含了前(
k
−
1
k-1
k−1)个单位正交向量组分的系数,在所有可能的向量
x
\mathbf{x}
x中,我们希望
A
x
\mathbf{Ax}
Ax就是向量
w
\mathbf{w}
w中前(
k
−
1
k-1
k−1)个单位正交向量组分,因此可以使用LS算法来进行优化:
x
∗
=
a
r
g
min
x
∣
∣
w
−
A
x
∣
∣
2
2
v
k
=
w
−
A
x
∗
u
k
=
v
k
∣
∣
v
k
∣
∣
2
\mathbf{x^*} = arg\min_{x}||\mathbf{w}-\mathbf{Ax}||_2^2 \\ \mathbf{v_k} = \mathbf{w}-\mathbf{Ax^*} \\ \mathbf{u_k} = \frac{\mathbf{v_k}}{||\mathbf{v_k}||_2}
x∗=argxmin∣∣w−Ax∣∣22vk=w−Ax∗uk=∣∣vk∣∣2vk
我们来看看这个最优的
x
∗
\mathbf{x^*}
x∗究竟是什么呢?
x
∗
=
a
r
g
min
x
∣
∣
w
−
A
x
∣
∣
2
2
=
(
A
T
A
)
A
T
w
k
=
A
T
w
k
=
(
u
1
T
w
k
⋮
u
k
−
1
T
w
k
)
\begin{aligned} \mathbf{x^*} &= arg\min_{x}||\mathbf{w}-\mathbf{Ax}||_2^2 \\ &=(\mathbf{A^TA})\mathbf{A^Tw_k} \\ &=\mathbf{A^Tw_k} \\ &= \begin{pmatrix} \mathbf{u_1^Tw_k} \\ \vdots \\ \mathbf{u_{k-1}^Tw_k} \end{pmatrix} \end{aligned}
x∗=argxmin∣∣w−Ax∣∣22=(ATA)ATwk=ATwk=⎝
⎛u1Twk⋮uk−1Twk⎠
⎞
果然,最优的
x
∗
\mathbf{x^*}
x∗就是由向量
w
\mathbf{w}
w中前
k
−
1
k-1
k−1个单位正交基的组分的系数组成的。这样才能实现
∣
∣
w
−
A
x
∣
∣
2
2
||\mathbf{w}-\mathbf{Ax}||_2^2
∣∣w−Ax∣∣22的最小化,即当向量
w
\mathbf{w}
w排除到其他组分后,剩下的
u
k
\mathbf{u_k}
uk组分才能恰好与矩阵
A
\mathbf{A}
A所确定的超平面正交。
所以,回到问题,最后一个正交向量是:
v
k
=
w
−
A
x
∗
(
把组分全部排除掉
)
\mathbf{v_k} = \mathbf{w}-\mathbf{Ax^*}(把组分全部排除掉)
vk=w−Ax∗(把组分全部排除掉)
我们想用d3画一个网络路由图,起始节点和结束节点是固定的,但中间的路径不同,可能共享一些节点,例如:我阅读了来自Configurefixed-layoutstaticgraphind3.js的评论并成功创建了一个简单的图形,如:但是当我向图中添加更多节点时,它变得随机(刷新后不是静态的)并且不再是正交的:所以我的问题是:是否可以使用d3.js来绘制接近所需的东西图形?或者有没有我应该在我的工作中使用的算法图实现? 最佳答案 在这里看我的演示。http://jsfiddle.net/doraeimo/JEcdS/主要思想是基于树建立连
我在使用raycaster的正交相机选择对象时遇到了一些困难。虽然,当我使用透视相机时,我没有问题。在两者之间切换时,我唯一要改变的是相机类型。我可以在正交View中选择面孔,但这与我在屏幕上单击的位置松散相关。当我可以在远离物体的地方点击时,它仍然会回来,就好像它击中了靠近其中心的物体。关于我在这里遗漏的任何想法?我的大部分代码都基于这个example,并希望从我的代码中获得非常相似的结果。(我引用的这个例子使用了透视相机)非常感谢任何帮助canvas{left:0;top:0;width:100%;height:100%;position:fixed;background-colo
我正在开发一个显示一些3D模型的应用程序。我们加载模型,创建网格,将它们添加到场景中……标准程序。添加最后一个网格后,我们计算边界框以移动相机并覆盖所有场景,使用总几何体的大小和视口(viewport)的大小进行数学计算。if(bounds.bx/bounds.bybounds是一个对象,包含边界框的宽度和高度。在这个计算之后,我们移动相机(加上一点比例,只是为了美观,我们想要在几何图形和屏幕边框之间留一点空间:))并渲染camera.position.z=r*1.05;到目前为止,这已经实现并运行正常。这是通过PerspectiveCamera完成的。现在我们想改变它并使用Ortho
我正在为我们的THREE.js应用开发正交相机。从本质上讲,该摄像头将以2D形式向用户呈现场景(用户可以选择在2D和3D摄像头之间切换)。此相机将允许平移和缩放到鼠标点。我有平移工作,我有缩放工作,但没有缩放到鼠标点。这是我的代码:importReactfrom'react';importTfrom'three';letpanDamper=0.15;letOrthoCamera=React.createClass({getInitialState:function(){return{distance:150,position:{x:8*12,y:2*12,z:20*12},};},ge
我有2个vector(V1{x1,y1,z1},V2{x2,y2,z2}),我想围绕旋转V1X轴、Y轴和Z轴与V2平行。我想找到3个旋转角度。我可以使用任何通用公式来找到它们吗? 最佳答案 我会这样做:A=V1xV2;//Crossproduct,thisgivestheaxisofrotationsin_angle=length(A)/(|V1||V2|);//sineoftheanglebetweenvectorsangle=asin(sin_angle);A_n=normalize(A);现在您可以使用角度和A_n构建四元数。
风格迁移:一文梳理经典方法发展脉络及原理1.ImageStyleTransferUsingConvolutionalNeuralNetworks:Gram矩阵(CVPR2016)1.1.概述1.2.方法2.DeepPhotoStyleTransfer(CVPR2017)2.1.概述2.2.方法3.UniversalStyleTransferviaFeatureTransform:WCT(whiteningandcoloring)(NIPS2017)3.1.概述3.2.方法4.AClosed-formSolutiontoPhotorealisticImageStylization:PhotoWC
我想对(-\infty,a]中的概率密度函数进行积分,因为cdf在封闭形式下不可用。但我不确定如何在C++中执行此操作。这个任务在Mathematica中非常简单;我需要做的就是定义函数,f[x_,lambda_,alpha_,beta_,mu_]:=Module[{gamma},gamma=Sqrt[alpha^2-beta^2];(gamma^(2*lambda)/((2*alpha)^(lambda-1/2)*Sqrt[Pi]*Gamma[lambda]))*Abs[x-mu]^(lambda-1/2)*BesselK[lambda-1/2,alphaAbs[x-mu]]E^(b
我正在开发一款由2个阶段组成的游戏,其中一个阶段具有正交投影,另一个阶段具有透视投影。目前,当我们在两种模式之间切换时,我们会逐渐变黑,然后在新的相机模式下返回。我将如何在两者之间顺利过渡? 最佳答案 可能有几种方法可以实现这一点,我发现最有效的两种方法是:将所有矩阵元素从一个矩阵跳到另一个矩阵。显然,考虑到所有因素,这都很有效。不过,我认为这种转变不会呈线性。你可以尝试给它一个缓动函数而不是线性插值Adollyzoom在去往/来自接近0视野的透视矩阵上。你会从正交矩阵跳到近0透视矩阵并将fov移到你的目标,并且可能会在你进行时大量
我想在我的应用中使用正交投影来显示3D场景。在我的代码中,我在场景中放了一个盒子,并像打击一样设置了PointofView的正交投影。(0,0,500)处的相机看向-z方向,盒子位于世界原点。所以相机应该能够捕捉到盒子。letcameraNode=SCNNode()letpov=SCNCamera()pov.usesOrthographicProjection=trueletwidth=UISreen.main.bounds.size.widthletglMat=GLKMatrix4MakeOrtho(-width/2,width/2,-width/2,width/2,1,1000)p
我想使用HiveQL创建一个n-gram列表。我的想法是使用具有先行和拆分功能的正则表达式-但是这不起作用:selectsplit('Thisismysentence','(\\S+)+(?=(\\S+))');输入的是表格的一列|sentence||-------------------------||Thisismysentence||Thisisanothersentence|输出应该是:["Thisis","ismy","mysentence"]["Thisis","isanother","anothersentence"]Hive中有一个n-gramudf,但该函数直接计算n