DS2 Languageで行列の積
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%macro mult_matrix(in1=, in2=, out1=); | |
%local i j; | |
%do i = 1 %to 2; | |
proc contents data = &&in&i.. out = __m&i.(keep=name varnum nobs) noprint; | |
run; | |
* 変数名・行数・列数をマクロ変数に格納 ; | |
data _null_; | |
set __m&i. end = eof; | |
call symputx("x&i._" || compress(put(_n_, best.)), name); | |
if eof then do; | |
call symputx("r&i.", nobs); | |
call symputx("c&i.", varnum); | |
end; | |
run; | |
* 変数名を変換 ; | |
data _m&i.; | |
set &&in&i..; | |
rename %do j = 1 %to &&c&i..; | |
&&x&i._&j.. = x&i._&j. | |
%end; | |
; | |
run; | |
%end; | |
* 行列の積を計算 ; | |
proc ds2; | |
data &out1. / overwrite = yes; | |
drop i x:; | |
declare double i; | |
vararray double x1_[&c1.]; | |
vararray double x2_[&c2.]; | |
vararray double z[&c2.]; | |
declare package matrix m1 m2 m3; | |
method init(); | |
m1 = _new_ [this] matrix(&r1., &c1.); | |
m2 = _new_ [this] matrix(&r2., &c2.); | |
do i = 1 to &r1.; | |
set _m1; | |
m1.in(x1_, i); | |
end; | |
do i = 1 to &r2.; | |
set _m2; | |
m2.in(x2_, i); | |
end; | |
end; | |
method term(); | |
m3 = m1.mult(m2); | |
do i = 1 to &r1.; | |
m3.out(z, i); | |
output; | |
end; | |
end; | |
enddata; | |
run; | |
quit; | |
%mend mult_matrix; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment