全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1311 1
2018-02-25
/*
难道又是SAS/IML的bug, 求高手解答

在做线性代数习题时,有一道例题,把矩阵a化简为阶梯形矩阵。
        a = {        6        2        2        2        4        ,
                        2        2        0        0        -4        ,
                        2        0        2        0        2        ,
                        2        0        0        2        6        } ;
书中答案是:
        x = {        1        0        0        1        3        ,
                        0        1        0        -1        -5        ,
                        0        0        1        -1        -2        ,
                        0        0        0        0        0        } ;
会线性代数的同学可手工化简一下,答案确实如上。

但问题是, 我在SAS/IML里用如下代码计算时, 给出的答案是
        x = {        1        0        0        1        0        ,
                        0        1        0        -1        0        ,
                        0        0        1        -1        0        ,
                        0        0        0        0        1        } ;
这明显不对嘛!而且每个矩阵只能化简成惟一的阶梯形矩阵,不可能有多个解的嘛!

我的代码应该也没错误。 我计算别的例题的矩阵时,用如下代码都能得出正确答案。
各位可在自己的SAS里跑一跑, 看是不是这个情况 ?!

难道是我对echelon()这个函数理解有误?!
百思不得其解中!

求高手赐教 。

*/



proc iml ;
        a = {        6        2        2        2        4        ,
                        2        2        0        0        -4        ,
                        2        0        2        0        2        ,
                        2        0        0        2        6        } ;
        print a ;

        x = echelon(a) ;  /* 将矩阵a化简为阶梯形. */
        print x ;
quit ;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2018-2-25 21:56:28

/*
为查找原因,忙乎了一下午。
首先怀疑是矩阵a有问题。 因为a这里行线性相关。 容易验证:a的第2行=第1行-第3行-第4行 。
但这不应该是导致问题的原因呀! 这无论如何说不通啊。

然后看echelon函数的自带帮助文件,也没有特别的说明。

继续忙碌中...
嘿! 又有新的发现。
把上述矩阵a,各行都扩大10倍, 根据线性代数的知识,化简所得阶梯型矩阵应当是不变的。
运行同样的代码,瞧瞧,  这时得出的结果就是正确的了。
有趣吧。

后面还实验了一下,你把任意一行扩大10倍, 都能得出正确的结果。

唉!想不通这里面的缘故。
或许和sas里数字的存储方式和算法有关?

总之,可以确认SAS/IML这里必定存在问题 。

补充一句, 我用的是sas9.1.3 。谁有后面的新版本, 可以实验一下, 看有没有同样的问题。  在另一台9.3也这样。

*/

proc iml ;
        a = {        60        20        20        20         40        ,
                        20        20        0        0         -40 ,
                        20        0        20        0         20        ,
                        20        0        0        20         60        } ;
        print a ;

        x = echelon(a) ;  /* 将矩阵a化简为阶梯形. */
        print x ;


quit ;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群