大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
前言
本文是博主对于 Zhi-quan Luo 老师的经典著作 《Semidefinite Relaxation of Quadratic Optimization Problems》 的读书笔记,希望可作为对全文以中文形式的核心梳理。
单刀直入
首先, Semidefinite Relaxation (SDR) 适用的问题可以写为如下形式:
min x ∈ R n x T C x s.t. x T A i x ⊵ i b i , i = 1 , … , m (1) \begin{aligned} \min _{x \in \mathbb{R}^{n}} & \;\;x^{T} C x \\ \text { s.t. } & x^{T} A_{i} x \unrhd_{i} b_{i}, \quad i=1, \ldots, m \end{aligned}\tag{1} x∈Rnmin s.t. xTCxxTAix⊵ibi,i=1,…,m(1)
有几个注意点:
- 暂时定义在实数域上, 但复数域有类似的结论。
- ⊵ i \unrhd_{i} ⊵i 表示 ≥ \ge ≥, ≤ \le ≤, = = = 的 其中之一。也就是说, 只要限制条件是二次约束即可。
- C C C, A i A_i Ai 都是对称矩阵。 即, C , A 1 , … , A m ∈ S n C, A_{1}, \ldots, A_{m} \in \mathbb{S}^{n} C,A1,…,Am∈Sn。
显然, 目标函数和限制条件中都有两个 x x x, 因此这类问题也被称为 二次约束二次规划 (quadratically
constrained quadratic programs, QCQP) 问题。 需要注意的是, 这并不是一个凸问题。 因为 x T A i x > 0 x^{T} A_{i} x>0 xTAix>0 和 x T A i x = 0 x^{T} A_{i} x=0 xTAix=0 都并非一个凸集。
而SDR方法的目的就是将问题转化为一个凸问题从而求解。
我们引入一个新的变量 X = x x T X = xx^T X=xxT, 并以此为优化变量, 那么问题(1)可以被写为:
min X ∈ S n Tr ( C X ) s.t. Tr ( A i X ) ⊵ i b i , i = 1 , … , m , X ⪰ 0 , rank ( X ) = 1 (2) \begin{aligned} \min _{X \in \mathbb{S}^{n}} & \operatorname{Tr}(C X) \\ \text { s.t. } & \operatorname{Tr}\left(A_{i} X\right)\unrhd_{i} b_{i}, \quad i=1, \ldots, m, \\ & X \succeq 0, \operatorname{rank}(X)=1 \end{aligned}\tag{2} X∈Snmin s.t. Tr(CX)Tr(AiX)⊵ibi,i=1,…,m,X⪰0,rank(X)=1(2)
详细解释一下这一步的转化:
- 注意到 (1) 的 目标函数 x T C x x^TCx xTCx显然是一个标量。 而标量可以看成一个 1 × 1 1\times 1 1×1的矩阵, 且迹等于本身。 即 t r ( x T C x ) = x T C x \mathrm{tr}(x^TCx)=x^TCx tr(xTCx)=xTCx。 而根据迹的性质, 有 t r ( A B ) = t r ( B A ) \mathrm{tr}(AB) = \mathrm{tr}(BA) tr(AB)=tr(BA)。 也就是说, t r ( x T C x ) = t r ( C x x T ) = t r ( C X ) \mathrm{tr}(x^TCx)=\mathrm{tr}(Cxx^T)=\mathrm{tr}(CX) tr(xTCx)=tr(CxxT)=tr(CX)。 这也就变成了 (2)中的目标函数。 那么 (2) 中的限制条件,也就可以根据相同的变换轻易得到。
- 相比于(1), (2)中多了两个限制条件, 这是由于 X = x x T X = xx^T X=xxT 引入的。 显然 rank ( X ) = 1 \operatorname{rank}(X)=1 rank(X)=1, 因为 X X X的所有列都线性相关。 也因此,只有一个特征值等于 x T x x^Tx xTx,显然是大于0的,所以肯定是半正定矩阵。
这一步转化的意义在哪呢?
事实上, 除了 rank ( X ) = 1 \operatorname{rank}(X)=1 rank(X)=1 这个限制以外, 整个问题是一个凸问题。 由于迹函数是个仿射变换, 很容易证明其凸性。 而半正定约束也显然是个凸集, 因为两个半正定矩阵的和一定也是一个半正定矩阵。
因此, 工程上很自然的想法就是, **暂时得忽略 该约束 rank ( X ) = 1 \operatorname{rank}(X)=1 rank(X)=1, 并通过凸优化方法 (事实上以CVX工具包为代表的内点法数值算法)来求解出一个解 X X X. 这一步大家百度下CVX的使用就可以了,没有任何障碍。
而问题的关键点在于,始终我们问题需要得到的是 x x x,而非 X X X。 如果通过凸优化求出的 X X X刚好就是一个 rank ( X ) = 1 \operatorname{rank}(X)=1 rank(X)=1的矩阵,那么 x x x可以直接得到(对X做个SVD或EVD啥的都可以)。 但更多时候, X X X没有道理是一个 rank ( X ) = 1 \operatorname{rank}(X)=1 rank(X)=1的矩阵。 也就是说, 根本不存在一个 x x x, 使得 X = x x T X=xx^T X=xxT。
工程实现
那么SDR要解决的另一个问题就是如何从 X X X中恢复出一个满足原问题约束的 x x x。
出于工程实现角度的思路其实非常清晰, 我们可以直接求解下面的问题以获得 x x x:
min x ∥ X − x x T ∥ F 2 (3) \min_x \;\; \|X-xx^T\|_F^2\tag{3} xmin∥X−xxT∥F2(3)
即找一个最接近 X X X的 x x T xx^T xxT。 这个问题很经典了,而他的闭式解就是, x x x是 X X X的最大特征向量乘以最大特征值的平方根。 即, 将 X X X的特征值分解表示为:
X ⋆ = ∑ i = 1 r λ i q i q i T X^{\star}=\sum_{i=1}^{r} \lambda_{i} q_{i} q_{i}^{T} X⋆=i=1∑rλiqiqiT
其中 λ i \lambda_i λi, q i q_i qi,代表第 i i i大的特征值和对应的特征向量。 那么(3)的最优解 x x x就是 x ~ = λ 1 q 1 \tilde{x}=\sqrt{\lambda_{1} }q_1 x~=λ1q1。
但是,问题又出现了! 虽然 X X X满足了(2)中的所有的约束, 但由于在这一步中,(3)中求得的 x x x是一个近似的结果。 此时得到的 x x x,不一定满足原问题(1)中的约束了! 也就是说, 经过一顿转化之后, 求得的 x x x并不是原问题的可行解!此时怎么办呢? 解决方案也非常符合工程思维:直接从 x x x出发找一个离 x x x最近的可行解, 这就是SDR的最终结果。
最后提两点:
- 直接从 x x x出发找一个离 x x x最近的可行解, 这本身就是一个独立的问题, 具体问题具体分析,后面会给一个具体的例子。
- 毫无疑问,在SDR中有许许多多的近似,工程处理。 因此, SDR的解远非全局最优解。
具体实例
为节约篇幅, 本文只讲一个例子。 也不是论文中给出的, 而是HBF混合波束成形的经典论文 《Alternating Minimization Algorithms for Hybrid Precoding in Millimeter Wave MIMO Systems》中的 一个使用。 有兴趣的读者也可以去看 SDR论文的原文, 接触更多的例子。
以HBF为例, 作者将问题转化为了如下的形式, 熟悉HBF的读者应该很亲切了:
minimize F B B ∥ F o p t − F R F F B B ∥ F 2 subject to ∥ F B B ∥ F 2 = N R F t N s N t (4) \begin{array}{ll} \underset{\mathbf{F}_{\mathrm{BB}}}{\operatorname{minimize}} & \left\|\mathbf{F}_{\mathrm{opt}}-\mathbf{F}_{\mathrm{RF}} \mathbf{F}_{\mathrm{BB}}\right\|_{F}^{2} \\ \text { subject to } & \left\|\mathbf{F}_{\mathrm{BB}}\right\|_{F}^{2}=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} \end{array}\tag{4} FBBminimize subject to ∥Fopt−FRFFBB∥F2∥FBB∥F2=NtNRFtNs(4)
作者使用了 SDR作为一种算法来求解该问题。 那么首先, 为什么会选用 SDR呢? 因为可以看到, 目标函数和限制条件都是二次形式, 这就是我们之前说到的SDR目标问题:QCQP问题。 接下来,通过这个例子展示如果实战使用SDR。
首先, 刚刚介绍SDR时都是向量形式的变量 x x x, 而(4)中都是矩阵,不利于处理, 因此第一步先进行列化:
∥ F o p t − F R F F B B ∥ F 2 = ∥ vec ( F o p t − F R F F B B ) ∥ 2 2 = ∥ vec ( F o p t ) − vec ( F R F F B B ) ∥ 2 2 = ∥ vec ( F o p t ) − ( I N s ⊗ F R F ) vec ( F B B ) ∥ 2 2 . \begin{aligned} \left\|\mathbf{F}_{\mathrm{opt}}-\mathbf{F}_{\mathrm{RF}} \mathbf{F}_{\mathrm{BB}}\right\|_{F}^{2} &=\left\|\operatorname{vec}\left(\mathbf{F}_{\mathrm{opt}}-\mathbf{F}_{\mathrm{RF}} \mathbf{F}_{\mathrm{BB}}\right)\right\|_{2}^{2} \\ &=\left\|\operatorname{vec}\left(\mathbf{F}_{\mathrm{opt}}\right)-\operatorname{vec}\left(\mathbf{F}_{\mathrm{RF}} \mathbf{F}_{\mathrm{BB}}\right)\right\|_{2}^{2} \\ &=\left\|\operatorname{vec}\left(\mathbf{F}_{\mathrm{opt}}\right)-\left(\mathbf{I}_{N_{s}} \otimes \mathbf{F}_{\mathrm{RF}}\right) \operatorname{vec}\left(\mathbf{F}_{\mathrm{BB}}\right)\right\|_{2}^{2} . \end{aligned} ∥Fopt−FRFFBB∥F2=∥vec(Fopt−FRFFBB)∥22=∥vec(Fopt)−vec(FRFFBB)∥22=∥vec(Fopt)−(INs⊗FRF)vec(FBB)∥22.
进行变量代换后 ( f = vec ( F o p t ) \mathbf{f}=\operatorname{vec}\left(\mathbf{F}_{\mathrm{opt}}\right) f=vec(Fopt), b = vec ( F B B ) \mathbf{b}=\operatorname{vec}\left(\mathbf{F}_{\mathrm{BB}}\right) b=vec(FBB) and E = I N s ⊗ F R F . \mathbf{E}=\mathbf{I}_{N_{s}} \otimes \mathbf{F}_{\mathrm{RF}} . E=INs⊗FRF.,原问题可写为:
minimize b ∥ t f − E b ∥ 2 2 subject to { ∥ b ∥ 2 2 = N R F t N s N t t 2 = 1 (5) \begin{aligned} &\underset{\mathbf{b}}{\operatorname{minimize}} \quad\|t \mathbf{f}-\mathbf{E b}\|_{2}^{2} \\ &\text { subject to } & \left\{\begin{array}{l} \|\mathbf{b}\|_{2}^{2}=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} \\ t^{2}=1 \end{array}\right. \end{aligned}\tag{5} bminimize∥tf−Eb∥22 subject to {
∥b∥22=NtNRFtNst2=1(5)
**这里必须强调的一点是, 作者引入了 t t t这样一个辅助变量。这是SDR的常见技巧之一!**接下来阐释这个 t t t的作用。
- 首先, 对于原问题的影响上:以(5)求解之后, 如果得到 t = 1 t=1 t=1, 那么 f \mathbf{f} f就是(4)的最优解。 而如果 t = − 1 t=-1 t=−1, 那么 f \mathbf{f} f就是(4)的最优解的相反数, 仍等效于得到了最优解。
- 其次, 加入这个 t t t辅助变量后, 可以更好地将(5)写成SDR的标准形式。 继续看:
目标函数可以写为:
∥ t f − E b ∥ 2 2 = [ b H t ] [ E H E − E H f − f H E f H f ] [ b t ] \|t \mathbf{f}-\mathbf{E b}\|_{2}^{2}=\left[\begin{array}{ll} \mathbf{b}^{H} & t \end{array}\right]\left[\begin{array}{cc} \mathbf{E}^{H} \mathbf{E} & -\mathbf{E}^{H} \mathbf{f} \\ -\mathbf{f}^{H} \mathbf{E} & \mathbf{f}^{H} \mathbf{f} \end{array}\right]\left[\begin{array}{l} \mathbf{b} \\ t \end{array}\right] ∥tf−Eb∥22=[bHt][EHE−fHE−EHffHf][bt]
注意到: 此时令 y = [ b t ] \mathbf{y}=\left[\begin{array}{l}\mathbf{b} \\ t\end{array}\right] y=[bt], C = [ E H E − E H f − f H E f H f ] \mathbf{C}=\left[\begin{array}{cc}\mathbf{E}^{H} \mathbf{E} & -\mathbf{E}^{H} \mathbf{f} \\ -\mathbf{f}^{H} \mathbf{E} & \mathbf{f}^{H} \mathbf{f}\end{array}\right] C=[EHE−fHE−EHffHf], 上式就等于 y H C y \mathbf{y}^H\mathbf{C}\mathbf{y} yHCy,而 C \mathbf{C} C是个显然的半正定矩阵: C = [ E , − f ] H [ E , − f ] \mathbf{C}=[\mathbf{E}, -\mathbf{f}]^H[\mathbf{E}, -\mathbf{f}] C=[E,−f]H[E,−f],一个矩阵的共轭转置乘以本身肯定是半正定矩阵(可从特征值角度得证)。
那么(5)中的另外两个约束又可以转换为:
∥ b ∥ 2 2 = [ b H t ] [ I N R F t N s 0 0 0 ] [ b t ] = N R F t N s N t t 2 = [ b H t ] [ 0 N R F t N s 0 0 1 ] [ b t ] = 1 \begin{aligned}\|\mathbf{b}\|_{2}^{2} &=\left[\begin{array}{ll}\mathbf{b}^{H} & t\end{array}\right]\left[\begin{array}{cc}\mathbf{I}_{N_{\mathrm{RF}}^{t}} N_{s} & 0 \\ \mathbf{0} & 0\end{array}\right]\left[\begin{array}{c}\mathbf{b} \\ t\end{array}\right]=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} \\ t^{2} &=\left[\begin{array}{ll}\mathbf{b}^{H} & t\end{array}\right]\left[\begin{array}{cc}0_{N_{\mathrm{RF}}^{t}} N_{s} & 0 \\ 0 & 1\end{array}\right]\left[\begin{array}{l}\mathbf{b} \\ t\end{array}\right]=1 \end{aligned} ∥b∥22t2=[bHt][INRFtNs000][bt]=NtNRFtNs=[bHt][0NRFtNs001][bt]=1
大家可以细致体会下, 为什么SDR可以应用广泛的原因, 因为大部分二次约束都可以通过稍加构造就写成QCQP的形式。
那么,最后经过一步变量代换:
y = [ b t ] , Y = y y H , C = [ E H E − E H f − f H E f H f ] A 1 = [ I N R F t N s 0 0 0 ] , A 2 = [ 0 N R F t N s 0 0 1 ] \begin{aligned} &\mathbf{y}=\left[\begin{array}{c} \mathbf{b} \\ t \end{array}\right], \mathbf{Y}=\mathbf{y} \mathbf{y}^{H}, \mathbf{C}=\left[\begin{array}{cc} \mathbf{E}^{H} \mathbf{E} & -\mathbf{E}^{H} \mathbf{f} \\ -\mathbf{f}^{H} \mathbf{E} & \mathbf{f}^{H} \mathbf{f} \end{array}\right] \\ &\mathbf{A}_{1}=\left[\begin{array}{cc} \mathbf{I}_{N_{\mathrm{RF}}^{t} N_{s}} & 0 \\ \mathbf{0} & 0 \end{array}\right], \mathbf{A}_{2}=\left[\begin{array}{cc} \mathbf{0}_{N_{\mathrm{RF}}^{t}} N_{s} & 0 \\ \mathbf{0} & 1 \end{array}\right] \end{aligned} y=[bt],Y=yyH,C=[EHE−fHE−EHffHf]A1=[INRFtNs000],A2=[0NRFtNs001]
(5)终于可写为SDR的标准形式:
minimize Y ∈ H n ( Tr C Y ) subject to { Tr ( A 1 Y ) = N R F t N s N t Tr ( A 2 Y ) = 1 Y ⪰ 0 , rank ( Y ) = 1 \begin{aligned} &\underset{\mathbf{Y} \in \mathbb{H}^{n}}{\operatorname{minimize}} \underset{\operatorname{Tr}}(\mathbf{C Y}) \\ &\text { subject to }\left\{\begin{array}{l} \operatorname{Tr}\left(\mathbf{A}_{1} \mathbf{Y}\right)=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} \\ \operatorname{Tr}\left(\mathbf{A}_{2} \mathbf{Y}\right)=1 \\ \mathbf{Y} \succeq 0, \operatorname{rank}(\mathbf{Y})=1 \end{array}\right. \end{aligned} Y∈HnminimizeTr(CY) subject to ⎩⎨⎧Tr(A1Y)=NtNRFtNsTr(A2Y)=1Y⪰0,rank(Y)=1
通过松弛掉最后一个约束, 问题就可以通过凸优化直接求解。
最后必须强调, 如何从 Y \mathbf{Y} Y中恢复出 b \mathbf{b} b(即原问题真正的目标)。 首先,用特征值分解得到 y \mathbf{y} y。 此时 y \mathbf{y} y的最后一个元素大概率不是1,而按照定义案例 t t t应该必须是 1 或 − 1 1或-1 1或−1。此时处理方式很简单, 直接对最后一个元素取正负号, 强行归成 1 1 1或 − 1 -1 −1即可。 而 b \mathbf{b} b( y \mathbf{y} y的前面的元素)也不符合 ∥ b ∥ 2 2 = N R F t N s N t \|\mathbf{b}\|_{2}^{2}=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} ∥b∥22=NtNRFtNs的约束,此时的做法就是将 b \mathbf{b} b强行归一化成 ∥ b ∥ 2 2 = N R F t N s N t \|\mathbf{b}\|_{2}^{2}=\frac{N_{\mathrm{RF}}^{t} N_{s}}{N_{t}} ∥b∥22=NtNRFtNs即可。 操作非常简单, 那么其对应的思路就是我们在上文中提到的:当得到了 x x x后, 以离 x x x最近的可行解作为原问题的解。
实例2
再举个近期的实例好了。 是来自于 智能反射面相关paper 《Intelligent Reflecting Surface Enhanced Wireless
Network: Joint Active and Passive Beamforming Design》中, 对于passive beamforming 的设计, 同样使用了 SDR 算法。
原问题可以转化为这样的形式:
max v v H Φ Φ H v + v H Φ h d + h d H Φ H v s.t. ∣ v n ∣ = 1 , ∀ n = 1 , ⋯ , N \begin{array}{cl} \max _{\boldsymbol{v}} & \boldsymbol{v}^{H} {\Phi} \Phi^{H} \boldsymbol{v}+\boldsymbol{v}^{H}{\Phi} \boldsymbol{h}_{d}+\boldsymbol{h}_{d}^{H}{\Phi}^{H} \boldsymbol{v} \\ \text { s.t. } & \left|v_{n}\right|=1, \forall n=1, \cdots, N \end{array} maxv s.t. vHΦΦHv+vHΦhd+hdHΦHv∣vn∣=1,∀n=1,⋯,N
简单而言, 就是其余参数都已给定, 要求优化向量 v \mathbf{v} v, 其中 v \mathbf{v} v的每个元素需要满足恒模约束。
那么同样的, 可以通过引入辅助变量 t t t, 把问题转换为 齐次的 QCQP 问题:
max v ‾ v ‾ H R v ‾ s.t. ∣ v ˉ n ∣ = 1 , ∀ n = 1 , ⋯ , N + 1 \begin{array}{cl} \max _{\overline{\boldsymbol{v}}} & \overline{\boldsymbol{v}}^{H} \boldsymbol{R} \overline{\boldsymbol{v}} \\ \text { s.t. } & \left|\bar{v}_{n}\right|=1, \forall n=1, \cdots, N+1 \end{array} maxv s.t. vHRv∣vˉn∣=1,∀n=1,⋯,N+1
其中,
R = [ Φ Φ H Φ h d h d H Φ H 0 ] , v ‾ = [ v t ] \boldsymbol{R}=\left[\begin{array}{cc} \boldsymbol{\Phi} \Phi^{H} & \mathbf{\Phi} \boldsymbol{h}_{d} \\ \boldsymbol{h}_{d}^{H} \boldsymbol{\Phi}^{H} & 0 \end{array}\right], \quad \overline{\boldsymbol{v}}=\left[\begin{array}{l} v \\ t \end{array}\right] R=[ΦΦHhdHΦHΦhd0],v=[vt]
那么根据SDR的方法, 令 V = v ˉ v ˉ H \mathbf{V}=\bar{\mathbf{v}}\bar{\mathbf{v}}^H V=vˉvˉH, 就可以将问题转化为:
max V tr ( R V ) s.t. V n , n = 1 , ∀ n = 1 , ⋯ , N + 1 , V ⪰ 0 \begin{array}{ll} \max _{\boldsymbol{V}} & \operatorname{tr}(\boldsymbol{R} \boldsymbol{V}) \\ \text { s.t. } & \boldsymbol{V}_{n, n}=1, \forall n=1, \cdots, N+1, \\ & \boldsymbol{V} \succeq 0 \end{array} maxV s.t. tr(RV)Vn,n=1,∀n=1,⋯,N+1,V⪰0
当然这里同样的放松掉了 rank ( V ) = 1 \operatorname{rank}(\boldsymbol{V})=1 rank(V)=1这一约束。 可以看到, 上述问题已经是凸问题了, 因为非凸的恒模约束经过转化后变成了 V n , n = 1 , ∀ n = 1 , ⋯ , N + 1 \boldsymbol{V}_{n, n}=1, \forall n=1, \cdots, N+1 Vn,n=1,∀n=1,⋯,N+1, 这无疑是一个凸约束 (可以用凸集的定义轻松得证)。
因此, SDR也是处理恒模约束的一种思路。
注意, 这个例子的后续处理,也是从SDR解 V \mathbf{V} V获得原问题可行解的一种经典思路:SDR + Gaussian randomization. 这种处理相比于上面提到的直接寻找欧氏距离最近的 v \mathbf{v} v,会有通过复杂度提升换来的一定性能增益。
首先, 对 V \mathbf{V} V进行 EVD分解, 得到 V = U Σ U H \boldsymbol{V}=\boldsymbol{U} \boldsymbol{\Sigma} \boldsymbol{U}^{H} V=UΣUH, 此时, 我们令 v ‾ = U Σ 1 / 2 r \overline{\boldsymbol{v}}=\boldsymbol{U} \boldsymbol{\Sigma}^{\mathbf{1} / \mathbf{2}} \boldsymbol{r} v=UΣ1/2r, 其中 r ∈ C N ( 0 , I N + 1 ) \boldsymbol{r} \in \mathcal{C} \mathcal{N}\left(\mathbf{0}, \boldsymbol{I}_{N+1}\right) r∈CN(0,IN+1)。 注意, 如果是上面提到的普通SDR方法, r = [ 1 , 0 , ⋯ , 0 ] \mathbf{r}=[1, 0, \cdots, 0] r=[1,0,⋯,0], 即 v ˉ \bar{\mathbf{v}} vˉ等于最大特征向量。 而这里,引入了一个随机变量, 使得我们尝试更多种的 v ˉ \bar{\mathbf{v}} vˉ, 再选出使得目标函数值最大的 v ˉ \bar{\mathbf{v}} vˉ作为最优解。 可以看到, 这种方法其实就是通过遍历更多解来获得更好的性能。 最后, 还是把得到的 v ˉ \bar{\mathbf{v}} vˉ转换为可行解: v = e j arg ( [ v ˉ v ˉ N + 1 ] ( 1 : N ) ) \boldsymbol{v}=e^{j \arg \left(\left[\frac{\bar{v}}{\bar{v}_{N+1}}\right]_{(1: N)}\right)} v=ejarg([vˉN+1vˉ](1:N))。
代码
关于SDR 更细节一些的实现和相关代码, 在下一篇博文 经典的SDR算法(下):SDR的具体使用细节与相关代码 进行了更详细的介绍。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/219291.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...