SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 951|回复: 4
打印 上一主题 下一主题

请教高手:如何把下三角矩阵转为对称矩阵?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-7-2 13:15:36 | 只看该作者

请教高手:如何把下三角矩阵转为对称矩阵?

比如,有一个下三角矩阵:
x1 x2 x3
1 . .
2 1 .
3 4 1

想得到对称矩阵如下:
1 2 3
2 1 4
3 4 1

怎么实现? 多谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-7-2 13:52:39 | 只看该作者

Re: 请教高手:如何把下三角矩阵转为对称矩阵?

用IML已经搞定,不知道能不能用DATA步搞定?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-7-2 14:11:55 | 只看该作者

Re: 请教高手:如何把下三角矩阵转为对称矩阵?

个人觉得这种问题还是用iml。
方法一:iml
[code:3uticvzs]
proc iml;
        A={1 . .,2 1 .,3 4 1};
        B=sqrsym(symsqr(A));
        print B;
quit;
[/code:3uticvzs]



方法二:DATA步
[code:3uticvzs]

data a;
        input x1-x3;
        cards;
1 . .
2 1 .
3 4 1
;
run;
proc transpose data=a out=b(keep=col:);
run;
data result(drop=col: i);
        merge a b;
        array x{*} x:;
        array col{*} col:;
        do i=1 to 3;
                if _n_<i then x(i)=col(i);
        end;
run;
[/code:3uticvzs]


个人观点,仅供参考
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-7-2 14:51:46 | 只看该作者

Re: 请教高手:如何把下三角矩阵转为对称矩阵?

多谢! 赞成你的看法,还是用IML比较合适.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-7-2 16:14:25 | 只看该作者

Re: 请教高手:如何把下三角矩阵转为对称矩阵?

写着玩的,9.2可用
[code:3hjgfunz]proc fcmp outlib=work.func.quot;
        subroutine symmetric_matrix(in_ds $,out_ds $);
                array in[1] /nosymbols;
                array var[1] /nosymbols;
                rc=read_array(in_ds,in);
                n=dim(in);
                call dynamic_array(var,n,n);
                call transpose(in,var);
                do i=1 to n;
                        do j=1 to n;
                                if i>j then var[i,j]=in[i,j];
                        end;
                end;
                rc=write_array(out_ds,var);
        endsub;
run;

data a;
        input x1-x3;
datalines;
1 . .
2 1 .
3 4 1
;
options cmplib=work.func;
data _null_;
        call symmetric_matrix('a','b');
run;[/code:3hjgfunz]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 03:29 , Processed in 0.127436 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表