这里java的矩阵运算用的是ujmp包
sas和java的矩阵名一律以m(Means for matrix)表示,
向量一律用v(vector)表示
数值用num表示
结果用res(result)表示
1:sas创建行向量,列向量和矩阵
v = {1 2 3 4};行向量
v = {1,2,3,4};列向量
v = {1 2,3 4};矩阵
选择一列或一行/多行或多列
单行列的情况
sas列 res = m[,j]; java列 res = m.selectColumns(Calculation.Ret.NEW, j);
sas行 res = m[i,]; java行 res = m.selectColumns(Calculation.Ret.NEW, i);
多行列的情况,单这里是针对要么行全部/列全部
sas res = m[,mj]; mj是行向量,这样就可以选取多列多行情况一样。
java res=m.selectColumns(Calculation.Ret.NEW, mj.toLongArray()[0]); 将mj转化为数组的行书进行处理。
截取子矩阵,行列都可以设置
lx->left x ly->left y
rx->right x ry->right y
sas: m[lx:rx,ly:ry];
java: m.subMatrix(Calculation.Ret.NEW, lx, ly, rx, ry)
2:选择矩阵中的distinct值
sas: res=unique(m);结果以行向量表示
java: res=m.unique(Calculation.Ret.NEW);结果一列向量表示
3:获取矩阵的行数与列数
sas: res = nrow(m) java:res = m.getRowCount();
sas: res = ncol(m) java:res = m.getColumnCount();
4:创建几种特殊的矩阵
sas:m*n值全为value的矩阵 m = j(m,n,value);
java:m*n值全为value的矩阵 m = Matrix.factory.ones(m,n).times(value);
对角矩阵
sas:对角线全为1的n维矩阵 m=i(n);
java:对角线全为1的n维矩阵 m=Matrix.factory.eye(n,n);
空矩阵
sas:这个、、、完全没必要,随便写一个变量即为矩阵、、、
java : res = MatrixFactory.emptyMatrix();
5:矩阵与向量以及向量与向量间一一对应相乘
例如{1 2 3}#{1 2 3}={1 4 9}
{1 2 3, 4 5 6}#{1 2 3}={1 4 9,4 10 18}
sas: res=v1#v2; res=m#v;
java: res=v.times(Calculation.Ret.NEW, true, v1); true是忽略缺失值,缺失值项乘得的结果为0。java暂时只找到向量间一一对应的
6:额。。。这个操作有点难描述
就是一个数和一个矩阵进行比较,数值相同的赋值为1,不同的变为0,也就是数和矩阵间的异或
例如m={1,2,3} var=1;
m=var ---->{1,0,0}
sas: res=(m=var);这里返回的结果的表现为{1,0}
java: res=m.euqal(var); 这里返回的结果的表现为{true,false},对返回的矩阵用getValueSum()可以得到double型的所有true的数量
对返回的矩阵用toDoubleMatrix()可以将其转换为1 0的形式
7:求出矩阵中的最大值与最小值
sas: res=max(m); res=min(m);
java: res=m.getMaxValue(); res=m.getMinValue();
8:横向合并和纵向合并
m1={1 2 3};
m2={1 2 3};
纵向 1 2 3 横向 1 2 3 1 2 3
1 2 3
sas:纵向合并 res=m1//m2; java:纵向合并 m1.appendVertically(m2)
sas:横向合并 rea= m1||m2; java:横向合并 m1.appendHorizontally(m2)
9:转置求逆
sas: 转置m` 那个点是大键盘一排数字键1左边的点 求逆inv(m)
java: 转置m.transpose() 求逆m.inv()