所以,我正在SAS例程上做一些“逆向工程” - 将它带到SQL和Pentaho。
我尝试直接浏览它,但是我注意到了许多冗余进程,因此我开始在思维导图中映射所有内容以识别所有冗余并在对SQL执行任何操作之前对其进行处理。
我偶然发现了这些问题:
use table1
read all into A
use table2
read all into B
fieldA = nrow(B);
fieldB = B[,n:fieldA];
fieldC = 2.33*sqrt(A`*fieldB*A);
我不知道如何映射这个过程,特别是“fieldB”和sqrt中的等式。
有人能帮我一把吗?
(编辑)好吧,乔真的帮助了我和将军...我仍然存在两个疑问:
1-“fieldB = B [,n:fieldA];”这代表什么?我的意思是,我现在如果n是静态的,它会做什么,但我来到了过程的另一部分......
use table1;
read all into A;
use table2;
read all into B;
fieldA = ncol(B);
fieldB = ncol(A);
ncurvas = fieldA/fieldB;
N = J(ncurvas+1,1,fieldB);
N[1] = 1;
NCUM = cusum(N)-1;
fieldC = B[,(NCUM[&t]+1):NCUM[&t+1]];
直到fieldC,我都很好。我理解cusum所做的一切,但我真的不知道fieldC会发生什么。当我用& t = 1检查时,它显示了一个来自B的18x18矩阵,从B [1,1]开始 - 但是当我尝试另一个数字时,如10,它从B的col163开始。
2-我不知道这是否与矩阵变换/乘法有关,至少到目前为止我还不明白,但为什么“2.33 * sqrt(A` * fieldB * A)”(原始fieldC)返回单个值?它不应该返回矩阵吗?
答案 0 :(得分:2)
那个SAS / IML,只是要明确(与Base SAS非常不同)。
FieldB是B的所有行,以及B.' n'的一些列。那里没有定义,所以我不知道它会是什么;如果它是1,则它将是一个方阵(因此,如果它是4行5列,那么fieldB是一个4x4的矩阵,丢弃第五列)。
此测试代码显示结果:
proc iml;
B={1 2 3 4 5, 4 5 6 7 8, 7 8 9 10 11, 10 11 12 13 14};
print B;
fieldA = nrow(B);
print FieldA;
fieldB = B[,1:fieldA];
print FieldB;
quit;
结果:
B
1 2 3 4 5
4 5 6 7 8
7 8 9 10 11
10 11 12 13 14
fieldA
4
fieldB
1 2 3 4
4 5 6 7
7 8 9 10
10 11 12 13
FieldC正在使用矩阵变换和矩阵乘法。 SQRT将返回一个矩阵,其中每个值都是原始值的平方根,因此您可能会认为这很简单。矩阵乘法更复杂;请在SAS参考中查找更多详细信息: http://support.sas.com/documentation/cdl/en/imlug/59656/HTML/default/viewer.htm#langref_sect14.htm
维基百科页面实际上在回答如何实际操作方面要好一些。 http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29
最后,A`是A的转置,重要的可能是为了确保行/列的数量能够用于矩阵乘法。顺便说一句,我有点惊讶的是,fieldB不是这里A行的子集,除非这里没有公开的数据背后存在某种关系。