为扩大本人在cos 的地盘,
上篇已经发到该论坛
为编程的指导思想 和 已知 a x 求 b
例如2 AB=X 已知 b x 求 a
proc iml;
b0={4 5 6,3 6 8,5 -2 3,10 6 7};
c0={25 56 30,10 8 19,-20 5 16};
x=b0`; /*将原始矩阵转置后输出到数据集编程*/
create wxq var{x1 x2 x3 x4};
append from x;
y=c0;
create wxq1 var{y1 y2 y3};
append from y; data wxq16;
merge wxq wxq1;/*调用数据集编程观察实现结果矩阵元素的数值组合*/
do a1=1 to 4; do a2=1 to 3;do a3=1 to 5; do a4=-1 to 5;/*属于转置状态的左矩变量数值组合*/
a=sum(a1*x1,a2*x2,a3*x3,a4*x4);if y1=a | y2=a | y3=a then g=1;else g=. ;output;end;end;end;end;proc print;run;
data wxq168;set wxq16;if g=. then delete;if dif(a)=0 then delete;if dif2(a)=0 then delete;/*尽量删除符合条件的重复*/
t=sum(of a1-a4);/*左矩阵列和,结果矩阵末列元素*/
keep x1-x4 y1-y3 t;proc print data=wxq168;run;
proc iml;/*根据wxq168结果重新组合矩阵编程反求右矩阵 关键就是求得结果矩阵的末行向量=右矩阵行和*/
use wxq168;
read all into wx;
b1=(wx[7:8,1:4]//wx[13,1:4])`;n1=nrow(b1);/*列和*/n=repeat(1,n1,1);/*列向量*/
b=b1||n;
x1=wx[1,5:7]//wx[8,5:7]//wx[13,5:7]||(wx[1,8]//wx[8,8]//wx[13,8]);/*结果矩阵第一种组合*/
x=x1//b[+,];
a=x*inv(b);/*左矩阵之一*/
print b x a;
结果 的部分
SAS 系统
Obs X1 X2 X3 X4 Y1 Y2 Y
1255 6 8 3 7 -20 5 16 4 3 5 0 63 .
1256 6 8 3 7 -20 5 16 4 3 5 1 70 .
1257 6 8 3 7 -20 5 16 4 3 5 2 77 .
1258 6 8 3 7 -20 5 16 4 3 5 3 84 .
1259 6 8 3 7 -20 5 16 4 3 5 4 91 .
1260 6 8 3 7 -20 5 16 4 3 5 5 98 .
SAS 系统
Obs X1 X2 X3 X4 Y1 Y2 Y3 t
1 4 3 5 10 25 56 30 5
2 4 3 5 10 25 56 30 6
3 4 3 5 10 25 56 30 8
4 4 3 5 10 25 56 30 6
5 4 3 5 10 25 56 30 6
6 4 3 5 10 25 56 30 10
7 4 3 5 10 25 56 30 8
8 5 6 -2 6 10 8 19 6
9 5 6 -2 6 10 8 19 3
10 5 6 -2 6 10 8 19 6
11 5 6 -2 6 10 8 19 5
12 5 6 -2 6 10 8 19 9
13 6 8 3 7 -20 5 16 4
SAS 系统
B X A
4 5 6 1 25 56 30 5 18.84507 -8.577465 -5.605634 0.3380282
3 6 8 1 10 8 19 6 10.760563 -3.619718 2.1549296 -3.295775
5 -2 3 1 -20 5 16 4 7.3943662 1.1971831 1.4507042 -6.042254
10 6 7 1 22 15 24 4 1 1 1 1
注:解有时很多,不一一列举。有任何不满请联系wxq1638@yahoo.com.cn
[此贴子已经被作者于2008-3-19 22:09:58编辑过]