草庐IT

【高等数值分析】Krylov子空间方法

Bonennult 2023-07-27 原文

文章目录

1. 预备理论

现在需要求解一个大规模稀疏方程组 A x = b Ax=b Ax=b,可以用迭代法比如 Jacobi 迭代法、Gauss-Seidel 迭代法等,不过这一节要讨论的是 Krylov 子空间方法,核心部分是 Arnoldi 迭代。

1.1 Krylov 子空间

定理(Cayley-Hamilton):设 A ∈ C n × n A\in{\mathbb C}^{n\times n} ACn×n,则 A A A 的特征多项式 χ ( z ) \chi(z) χ(z) A A A 的零化多项式,也即 χ ( A ) = 0 \chi(A)=0 χ(A)=0

假设特征多项式 χ ( z ) = z n + c n − 1 z n − 1 + ⋯ + c 1 z + c 0 = ( − 1 ) n det ⁡ ( A ) \chi(z)=z^n + c_{n-1}z^{n-1} + \cdots + c_1 z+ c_0=(-1)^n \operatorname{det}(A) χ(z)=zn+cn1zn1++c1z+c0=(1)ndet(A),那么根据 χ ( A ) = 0 \chi(A)=0 χ(A)=0 可以得到
A − 1 = − 1 c 0 A n − 1 − c n − 1 c 0 A n − 2 + ⋯ − c 1 c 0 I = q n − 1 ( A ) A^{-1} = -\frac{1}{c_0} A^{n-1} - \frac{c_{n-1}}{c_0} A^{n-2} + \cdots -\frac{c_1}{c_0} I = q_{n-1}(A) A1=c01An1c0cn1An2+c0c1I=qn1(A)
利用这个等式,在求解线性方程组的时候,给定任意初值 x 0 x_0 x0,都有 A x ∗ − A x 0 = b − A x 0 ≡ r 0 Ax^{\ast}-Ax_0=b-Ax_0 \equiv r_0 AxAx0=bAx0r0,于是 x ∗ = x 0 + q n − 1 ( A ) r 0 x^{\ast} = x_0 + q_{n-1}(A)r_0 x=x0+qn1(A)r0,因此理论上可以在空间
K = { r 0 , A r 0 , ⋯   , A m r 0 , ⋯   , A n − 1 r 0 } \mathcal{K}=\left\{\boldsymbol{r}_{0}, A \boldsymbol{r}_{0}, \cdots, A^{m} \boldsymbol{r}_{0}, \cdots, A^{n-1} \boldsymbol{r}_{0}\right\} K={r0,Ar0,,Amr0,,An1r0}
中找到方程组的准确解,但是科学与工程计算问题中 n n n 可以达到 1 0 6 10^6 106 量级,直接求解代价太高。因此希望在其一个低维子空间中搜索近似解。

定义 m m mKrylov 子空间
K m = span ⁡ ( r 0 , A r 0 , A 2 r 0 , ⋯   , A m − 1 r 0 ) \mathcal{K}_{m}=\operatorname{span}\left(\boldsymbol{r}_{0}, A \boldsymbol{r}_{0}, A^{2} \boldsymbol{r}_{0}, \cdots, A^{m-1} \boldsymbol{r}_{0}\right) Km=span(r0,Ar0,A2r0,,Am1r0)
方程组求解问题转化为
min ⁡ x ∈ x 0 + K m ∥ x ∗ − x ∥ . \min_{x\in x_0+{\mathcal K}_m} \Vert x^{\ast} - x\Vert. xx0+Kmminxx.

1.2 最佳逼近

现在的问题就是在何种范数意义下求解问题 min ⁡ x ∈ x 0 + K m ∥ x ∗ − x ∥ \min_{x\in x_0+{\mathcal K}_m} \Vert x^{\ast} - x\Vert minxx0+Kmxx。假设 K m {\mathcal K}_m Km 的一组基作为列向量构成矩阵 V m V_m Vm,最优解为 x m = x 0 + V m y ∗ ∈ x 0 + K m ,   y ∗ ∈ R m x_m = x_0 + V_m y^{\ast} \in x_0 + {\mathcal K}_m, ~ y^{\ast}\in{\mathbb R}^{m} xm=x0+Vmyx0+Km, yRm

1.2.1 方法一:最佳平方逼近

2 2 2 范数 min ⁡ x ∈ x 0 + K m ∥ x ∗ − x ∥ 2 \min_{x\in x_0+{\mathcal K}_m} \Vert x^{\ast} - x\Vert_2 minxx0+Kmxx2,那么根据最佳平方逼近条件(对 x x x求导,取零点),或者 Galerkin 正交条件,可以推出法方程
⟨ x ∗ − x m , y ⟩ = 0 ,   ∀ y ∈ K m    ⟺    V m T ( x ∗ − x m ) = 0 \begin{aligned} &\langle x^{\ast} - x_m, y \rangle = 0, ~ \forall y\in {\mathcal K}_m \\ \iff & V_m^{\rm T}(x^{\ast}-x_m) = 0 \end{aligned} xxm,y=0, yKmVmT(xxm)=0
但是这个方法不可行!因为要求 x m x_m xm 就需要知道 x ∗ x^{\ast} x

1.2.2 方法二:假设 A A A 对称正定

A A A 对称正定,那么可以改求解问题 min ⁡ x ∈ x 0 + K m ⟨ A ( x − x ∗ ) , x − x ∗ ⟩ \min_{x\in x_0+{\mathcal K}_m} \langle A(x-x^{\ast}), x-x^{\ast}\rangle minxx0+KmA(xx),xx,根据Galerkin 正交条件有法方程
⟨ A ( x ∗ − x m ) , y ⟩ = 0 ,   ∀ y ∈ K m    ⟺    r m = A ( x ∗ − x m ) ⊥ K m    ⟺    V m T ( r 0 − A x m ) = 0 \begin{aligned} &\langle A(x^{\ast} - x_m), y \rangle = 0, ~ \forall y\in {\mathcal K}_m \\ \iff & r_m = A(x^{\ast}-x_m) \perp {\mathcal K}_m \\ \iff & V_m^{\rm T}(r_0 - Ax_m) = 0 \end{aligned} A(xxm),y=0, yKmrm=A(xxm)KmVmT(r0Axm)=0
这个方法可行!后面需要做两件事情:1)求出一组基 V m V_m Vm;2)解法方程。

Note:这里为了得到法方程,需要假设 A A A 对称正定。但是在后面的 FOM 方法中,不论 A A A 是否正定,都基于 Galerkin 条件直接采用了这一法方程来求解线性方程组。至于这么做是否有理论支持我也不太清楚,就姑且相信它是合理的。

1.2.3 方法三:残差2范数

A A A 非奇异,不去求解 min ⁡ ∥ x ∗ − x ∥ \min \Vert x^{\ast} - x\Vert minxx,而是求解 min ⁡ x ∈ x 0 + K m ∥ A ( x ∗ − x ) ∥ 2 \min_{x\in x_0+{\mathcal K}_m} \Vert A(x^{\ast} - x)\Vert_2 minxx0+KmA(xx)2,那么再次根据 Galerkin 条件,可以导出法方程
⟨ A ( x ∗ − x m ) , A y ⟩ = 0 ,   ∀ y ∈ K m    ⟺    r m = A ( x ∗ − x m ) ⊥ A K m    ⟺    V m T A T ( r 0 − A x m ) = 0 \begin{aligned} &\langle A(x^{\ast} - x_m), Ay \rangle = 0, ~ \forall y\in {\mathcal K}_m \\ \iff & r_m = A(x^{\ast}-x_m) \perp A{\mathcal K}_m \\ \iff & V_m^{\rm T}A^{\rm T}(r_0 - Ax_m) = 0 \end{aligned} A(xxm),Ay=0, yKmrm=A(xxm)AKmVmTAT(r0Axm)=0
这个方法也是可行的。

不论如何,上面几种方法最后都归结为两个问题:

  1. 获得 K m {\mathcal K}_m Km 的基底 V m V_m Vm:Gram-Schmidt 正交化方法;
  2. 求解法方程,并且计算残差:低维线性方程组求解。

2. 基底正交化

获得正交基底的方法主要有 Arnoldi 过程(CGS)、改进 Arnoldi 过程(MGS)、以及 Lanczos 过程。名字起的很 fancy,别被吓到,其实他们都只是 Gram-Schmidt 正交化方法。

2.1 Arnoldi 过程(CGS)

迭代过程可以归结为
v 1 = r 0 / ∥ r 0 ∥ w j = A v j − ⟨ A v j , v 1 ⟩ v 1 − ⟨ A v j , v 2 ⟩ v 2 − ⋯ − ⟨ A v j , v j ⟩ v j v j + 1 = w j ∥ w j ∥ 2 , j = 1 , 2 , ⋯ h i , j = ⟨ A v j , v i ⟩ \begin{aligned} \boldsymbol{v}_{1} &= \boldsymbol{r}_{0} / \Vert \boldsymbol{r}_{0} \Vert \\ \boldsymbol{w}_{j} &=A \boldsymbol{v}_{j}-\langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{1}\rangle \boldsymbol{v}_{1}-\langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{2}\rangle \boldsymbol{v}_{2}-\cdots-\langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{j}\rangle \boldsymbol{v}_{j} \\ \boldsymbol{v}_{j+1} &=\frac{\boldsymbol{w}_{j}}{\left\|\boldsymbol{w}_{j}\right\|_{2}}, j=1,2, \cdots \\ h_{i,j} &= \langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{i}\rangle \end{aligned} v1wjvj+1hi,j=r0/r0=AvjAvj,v1v1Avj,v2v2Avj,vjvj=wj2wj,j=1,2,=Avj,vi
得到的 { v 1 , v 2 , . . . , v m , . . . , v n } \{ v_1, v_2, ..., v_m,..., v_n \} {v1,v2,...,vm,...,vn} 是单位正交基。由 h i , j h_{i,j} hi,j 作为元素构成矩阵 H m ∈ R m × m H_m \in {\mathbb R}^{m\times m} HmRm×m,可以验证 H m H_m Hm 为 Hessenberg 阵,并且 h i + 1 , i = ∥ w i ∥ 2 h_{i+1,i}=\Vert \boldsymbol{w}_{i} \Vert_2 hi+1,i=wi2。在 H m H_m Hm 的基础上可以定义 H ˉ m ∈ R ( m + 1 ) × m \bar{H}_m \in {\mathbb R}^{(m+1)\times m} HˉmR(m+1)×m,也就是在最后一行下面再加一行 [ 0 , . . . , 0 , h m + 1 , m ] [0,...,0,h_{m+1,m}] [0,...,0,hm+1,m]

可以验证他们满足如下等式,这三个式子在后面会频繁用到,极其重要!
A V m = V m H m + w m e m T = V m + 1 H ˉ m V m T A V m = H m \begin{aligned} AV_m &= V_m H_m + \boldsymbol{w}_{m} \boldsymbol{e}_{m}^{\rm T} \\ &= V_{m+1} \bar{H}_m \\ V_m^{\rm T} A V_m &= H_m \end{aligned} AVmVmTAVm=VmHm+wmemT=Vm+1Hˉm=Hm

2.2 改进 Arnoldi 过程(MGS)

前面的 Arnoldi 过程在计算 w j \boldsymbol{w}_{j} wj 的时候,相当于把 A v j A \boldsymbol{v}_{j} Avj 分别计算了 j j j 次投影,每次都是向一个一维的子空间 span ⁡ { v i } \operatorname{span}\{ \boldsymbol{v}_{i} \} span{vi} 投影,可能会有计算不稳定的问题。对其进行改进的方法如下,交换顺序之后,每次都是向一个 n − 1 n-1 n1 维子空间投影。

2.3 Lanczos过程

是 Arnoldi 过程的特殊情况,当 A = A T A=A^{\rm T} A=AT,那么 H m H_m Hm 为三对角矩阵,那么 w j \boldsymbol{w}_{j} wj 的计算简化为
w j = A v j − ⟨ A v j , v j − 1 ⟩ v j − 1 − ⟨ A v j , v j ⟩ v j \boldsymbol{w}_{j} = A \boldsymbol{v}_{j}-\langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{j-1}\rangle \boldsymbol{v}_{j-1}-\langle A \boldsymbol{v}_{j}, \boldsymbol{v}_{j}\rangle \boldsymbol{v}_{j} wj=AvjAvj,vj1vj1Avj,vjvj

3. 方程组求解

针对上面几种不同的迭代过程,可以有不同的求解方法。

3.1 全正交方法 (FOM)

FOM (Full orthogonalization method) 根据 Galerkin 条件, r m ⊥ K m r_m\perp {\mathcal K}_m rmKm,根据法方程 V m T ( r 0 − A V m y ) = 0 V_m^{\rm T}(r_0 - AV_my)=0 VmT(r0AVmy)=0,因此有
r m ⊥ K m    ⟺    V m T ( r 0 − A V m y ) = 0 ⟹ H m y = ∥ r 0 ∥ e 1 \begin{aligned} & r_m\perp {\mathcal K}_m \iff V_m^{\rm T}(r_0 - AV_my)=0 \Longrightarrow H_m y = \Vert r_0\Vert \boldsymbol{e}_1 \end{aligned} rmKmVmT(r0AVmy)=0Hmy=r0e1
伪代码为

根据 x m = x 0 + V m y x_m = x_0 + V_m y xm=x0+Vmy,残差有 r m = r 0 − A V m y = r 0 − ( V m H m + w m e m T ) y = − w m e m T y r_m = r_0-AV_my=r_0-(V_m H_m + \boldsymbol{w}_{m} \boldsymbol{e}_{m}^{\rm T})y = -\boldsymbol{w}_{m} \boldsymbol{e}_{m}^{\rm T} y rm=r0AVmy=r0(VmHm+wmemT)y=wmemTy

3.2 D-Lanczos方法

A A A 对称,那么 H m H_m Hm 为三对角阵,特别地记为 T m T_m Tm
T m = ( α 1 β 2 β 2 α 2 β 3 ⋱ ⋱ ⋱ β m − 1 α m − 1 β m β m α m ) ∈ R m × m T_{m}=\left(\begin{array}{ccccc} \alpha_{1} & \beta_{2} & & & \\ \beta_{2} & \alpha_{2} & \beta_{3} & & \\ & \ddots & \ddots & \ddots & \\ & & \beta_{m-1} & \alpha_{m-1} & \beta_{m} \\ & & & \beta_{m} & \alpha_{m} \end{array}\right) \in \mathbb{R}^{m \times m} Tm=α1β2β2α2β3βm1αm1βmβmαmRm×m
T m T_m Tm 的 LU 分解为
T m = L m U m = ( 1 λ 2 1 ⋱ ⋱ λ m − 1 1 λ m 1 ) ( η 1 ω 2 η 2 ω 3 ⋱ ⋱ η m − 1 ω m η m ) T_{m}=L_{m} U_{m}=\left(\begin{array}{ccccc} 1 & & & & \\ \lambda_{2} & 1 & & & \\ & \ddots & \ddots & & \\ & & \lambda_{m-1} & 1 & \\ & & & \lambda_{m} & 1 \end{array}\right)\left(\begin{array}{ccccc} \eta_{1} & \omega_{2} & & & \\ & \eta_{2} & \omega_{3} & & \\ & & \ddots & \ddots & \\ & & & \eta_{m-1} & \omega_{m} \\ & & & & \eta_{m} \end{array}\right) Tm=LmUm=1λ21λm11λm1η1ω2η2ω3ηm1ωmηm
其中 ω m = β m \omega_{m}=\beta_{m} ωm=βm, λ m = β m η m − 1 \quad \lambda_{m}=\frac{\beta_{m}}{\eta_{m-1}} λm=ηm1βm, η m = α m − λ m ω m \quad \eta_{m}=\alpha_{m}-\lambda_{m} \omega_{m} ηm=αmλmωm。那么根据下面这一性质,Lanczos过程可以迭代进行
L m = ( L m − 1 0 l m − 1 T 1 ) , U m = ( U m − 1 y m − 1 0 T η m ) L m − 1 = ( L m − 1 − 1 0 − l m − 1 T L m − 1 − 1 1 ) , U m − 1 = ( U m − 1 − 1 − 1 η m U m − 1 − 1 y m − 1 0 T 1 / η m ) \begin{aligned} L_{m}=\left(\begin{array}{c|c} L_{m-1} & \mathbf{0} \\ \hline \boldsymbol{l}_{m-1}^{T} & 1 \end{array}\right), \quad &U_{m}=\left(\begin{array}{c|c} U_{m-1} & \boldsymbol{y}_{m-1} \\ \hline \mathbf{0}^{T} & \eta_{m} \end{array}\right) \\ L_{m}^{-1} = \left(\begin{array}{c|c} L_{m-1}^{-1} & \mathbf{0} \\ \hline -\boldsymbol{l}_{m-1}^{T}L_{m-1}^{-1} & 1 \end{array}\right), \quad & U_{m}^{-1}=\left(\begin{array}{c|c} U_{m-1}^{-1} & -\frac{1}{\eta_m} U_{m-1}^{-1} \boldsymbol{y}_{m-1} \\ \hline \mathbf{0}^{T} & 1/\eta_{m} \end{array}\right) \end{aligned} Lm=(Lm1lm1T01),Lm1=(Lm11lm1TLm1101),Um=(Um10Tym1ηm)Um1=(Um110Tηm1Um11ym11/ηm)
根据这个方法,还可以到处CG(共轭梯度)法的形式。

3.3 广义极小残量法(GMRES)

Generalized minimal residual method (GMRES) 实际上就是最小化参量的二范数,即 min ⁡ ∥ r m ∥ 2 = min ⁡ x ∈ x 0 + K m ∥ A ( x ∗ − x ) ∥ 2 \min \Vert r_m \Vert_2 = \min_{x\in x_0+{\mathcal K}_m} \Vert A(x^{\ast} - x)\Vert_2 minrm2=minxx0+KmA(xx)2,根据 Galerkin 条件,应有 r m ⊥ A K m    ⟺    V m T A T A V m y = V m T A T r 0 ,   y ∈ R m r_m\perp A{\mathcal K}_m \iff V_m^{\rm T}A^{\rm T}AV_my = V_m^{\rm T}A^{\rm T}r_0, ~ y\in{\mathbb R}^m rmAKmVmTATAVmy=VmTATr0, yRm

另个一思路是 min ⁡ ∥ r 0 − A V m y ∥ = min ⁡ ∥ V m + 1 ( ∥ r 0 ∥ e 1 − H ˉ m y ) ∥ = min ⁡ ∥ ∥ r 0 ∥ e 1 − H ˉ m y ∥ \min\Vert r_0-AV_my\Vert = \min \Vert V_{m+1} (\Vert r_0\Vert e_1 - \bar{H}_my)\Vert = \min \Vert \Vert r_0\Vert e_1 - \bar{H}_my\Vert minr0AVmy=minVm+1(r0e1Hˉmy)=minr0e1Hˉmy,最小二乘解 H ˉ m T ( H ˉ m y − ∥ r 0 ∥ e 1 ) = 0 \bar{H}_m^{\rm T}(\bar{H}_my - \Vert r_0\Vert e_1)=0 HˉmT(Hˉmyr0e1)=0

3.4 MINRES 方法

是 GMRES 的特殊情况,当 A = A T A=A^{\rm T} A=AT 的时候, H m H_m Hm 为三对角阵 T m T_m Tm min ⁡ ∥ r m ∥ 2 = min ⁡ ∥ ∥ r 0 ∥ e 1 − T m y ∥ \min \Vert r_m\Vert_2 = \min \Vert \Vert r_0\Vert e_1 - T_m y \Vert minrm2=minr0e1Tmy

最后给我的博客打个广告,欢迎光临
https://glooow1024.github.io/
https://glooow.gitee.io/

前面的一些博客链接如下
泛函分析专栏
高等数值分析专栏
【高等数值分析】多项式插值
【高等数值分析】函数逼近
【高等数值分析】数值积分和数值微分
【高等数值分析】常微分方程数值解
【高等数值分析】Krylov子空间方法

有关【高等数值分析】Krylov子空间方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  9. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  10. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

随机推荐