如何将MATLAB代码中的inv()替换为反斜杠运算符并简化?
问题描述
能否有人协助我将以下MATLAB代码转换为使用反斜杠运算符,替代当前使用的inv()函数:
n = 6; m = 18; R = diag( rand(1,n) ); A = rand(m,n); b = rand(m,1); X = inv(R) * A' * inv(A * inv(R) * A') * b;
(我知晓此示例中结果可能存在数学奇异性,因我仅创建随机矩阵展示各矩阵维度。我仅需转换为反斜杠用法的合适语法,甚至可对其简化。)
补充说明
这段代码源自求解二次规划问题的拉格朗日条件,消去λ后整理得到对应的表达式。
转换方案
MATLAB中反斜杠运算符\和斜杠/是求解线性方程组的高效方式,比inv()数值稳定性更好、计算效率更高,对应替换逻辑如下:
inv(M) * x等价于M \ x(本质是求解线性方程组M*y=x得到y)x * inv(M)等价于x / M(本质是求解线性方程组y*M=x得到y)
针对你的代码,我们可以逐步替换inv():
inv(R)*A'等价于R \ A'(因为R是对角矩阵,该运算会高效地对A'的每一行除以R的对应对角元素)inv(A*inv(R)*A')*b等价于(A*(R \ A')) \ b(先计算A*inv(R)*A'的等价形式,再用反斜杠求解对应的线性方程组)
最终转换后的代码为:
n = 6; m = 18; R = diag( rand(1,n) ); A = rand(m,n); b = rand(m,1); % 用反斜杠替换inv()的版本 X = (R \ A') * ((A * (R \ A')) \ b);
额外优化建议
由于R是对角矩阵,我们还可以进一步简化计算:先取出R的对角元素,用点运算实现R^{-1}的效果,再结合反斜杠,计算效率会更高:
r_diag = diag(R); % 等价于 inv(R)*A',点运算更适配对角矩阵特性 A_Rinv = A' ./ r_diag; % 求解 (A*A_Rinv)y = b,再计算X = A_Rinv*y X = A_Rinv * ((A * A_Rinv) \ b);
内容的提问来源于stack exchange,提问作者teeeeee
相关产品推荐
相关产品推荐

