Matlab求{1}-inverse

最近像疯狗一样搞了一波科研。

上次还是本科的偏微分方程考试前,一学期没上课做作业然后去医院缓考失败,晚上陪同学走完红毯以后开始预习,第二天八点考试。然后竟然是C-。

所以说,永远不能低估一个懒人的决心。

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------------

今天为啥要写这个呢,因为我怀疑Matlab里面的pinv用来求{1}-inverse,会有很大的精度误差,所以打算找一个求{1}-inverse的函数。

Matlab里面没有现成的,然后网上也找不到,为了偷懒不自己写我只能用rref了。

核心思路就是利用rref里面的高斯消元做两遍,由于没有查到rref怎么记录变换矩阵,所以用附加矩阵的方法可以记录下变换矩阵(必须感谢我的两个高代老师哈哈)。

为了偷懒我也是蛮拼的。

下面贴个代码,伸手党接好,错了别找我。(我也想伸手啊!!!)

function [ y ] = ginv( A )
    [m,n] = size(A);
    M1 = cat(2,A,eye(m));
    M2 = rref(M1);
    PA = M2(:,1:n);
    P = M2(:,n+1:n+m);
    M3 = cat(2,PA',eye(n));
    M4 = rref(M3);
    J = M4(:,1:m);
    Q = M4(:,m+1:m+n);
    y = Q'*J'*P;
end

偷到了懒心情大好,写个博客纪念一下哈哈。

(后记:果然精度提高了。然并卵,我发现pinv的误差在矩阵比较小的时候并不会把结果搞得很离谱,也就是还是错了,查了一下发现是别地儿码错了,哎。)

 

posted @ 2015-06-08 16:25  syb3181  阅读(835)  评论(0编辑  收藏  举报