这样的资源网络上是有的,不过大都是英文,这里姑且进行一些拾牙慧,用汉语进行标注。
1.行列式
*行列式特征;
proc iml; reset print log;
A = {3 1, 2 4};
r = det(A); *行列式的值;
r = det(A[{2 1},]);*交换行列式的行行列式变号;
r = det(A[,{2 1}]);*交换行列式的列行列式变号;
r = det( t(A) );*行列式与它的转置行列式相等;
*行列式的某行/列所有元素乘以K等于K乘以该行列式;
r = diag({3 1}) * A;
r = det( diag({3 1}) * A);
*矩阵乘以K的行列式,等于K的n方乘以该矩阵行列式;
r = det(3 # A);
*方阵乘积的行列式等于两方阵行列式的乘积;
B={ 4 2, 3 5};
r = det(B);
r = det(A * B);
r = det(A) # det(B);
*行列式中行列成比例,则行列式值为0;
C={1 5, 2 6, 4 4};
C=C || C[,1];
r = det(C);
*把行列式某一列/行的各元素乘以同一数后加到另一列/行
对应元素上去,行列式不变;
A[2,] = A[2,] - 2#A[1,];
r = det(A);
quit;
*行列式求值;
proc iml;
reset print log;
*计算行列式的余子式;
start cofactor(A,i,j);
reset noprint;
size = nrow(A); *矩阵维度;
rows = loc( (1:size) ^= i ); *删除第i行,loc函数用来生成由非零元素位置组成的行向量;
cols = loc( (1:size) ^= j ); *删除第j列;
minor = det( A[rows,cols] );
reset print;
return ( ((-1)##(i+j)) # minor );
finish;
*行列式按余子式展开;
A ={4 2 1, 5 6 7, 1 0 3};
r = det(A);
*按照第一行的余子式展开cofactors of row 1 elements;
print (cofactor(A,1,1)) (A[{2 3},{2 3}]);
print (cofactor(A,1,2)) (A[{2 3},{1 3}]);
print (cofactor(A,1,3)) (A[{2 3},{1 2}]);
*行列式等于行元素与其余子式的乘积和
det = product of row with cofactors;
r = A[1,] * {18, -8, -6};
*行列式按照高斯消元法求值;
M = {2 3 1 2, 4 2 3 4, 1 4 2 2, 3 1 0 1};
d = det(M);
*以M[1,1]为主元素进行消元,行列式等于各主元素的乘积;
D=M[1,1];
*首先消掉第一行,第一列同时被消掉;
M[1,] = M[1,] / M[1,1];
M = M - M[,1] * M[1,];
*剩下2、3、4行列组成新的行列式;
M = M[{2 3 4},{2 3 4}];
*主元素进行累积;
D = D # M[1,1];
*重复上述消元过程;
M[1,] = M[1,] / M[1,1];
M = M - M[,1] * M[1,];
M = M[{2 3},{2 3}];
D = D # M[1,1];
*再一次消元,等到行列式值d = det(m);
M[1,] = M[1,] / M[1,1];
M = M - M[,1] * M[1,];
M = M[2,2];
D = D # M[1,1];
quit;
2.矩阵
a.基本的矩阵
*基本的矩阵;
options nodate;
proc iml;
reset print log;
*一般矩阵;
X = {1 2 3, 4 0 6, 9 1 4, 6 2 4};
print (nrow(X)) (ncol(X));
rowvec = { 1 2 3};
colvec = { 1, 4, 6};
*矩阵转置;
xt = t(x);
xt = t(x);
*方阵;
A = {5 -1 3, -1 4 7, 3 3 -4};
*对角线元素组成的列向量:vecdiag函数;
d = vecdiag(A);
*对角阵;
d = diag({1 4 9});
*矩阵的迹:对角元素之和;
t = trace(A);
*对称阵;
sym = ( A = t(A) );
sym = all( A = t(A) );
*方阵性质;
B = ( A + t(A) ) / 2;
sym = all( B = t(B));
*上三角阵;
upper = {-5 2 7, 0 -2 4, 0 0 3};
*下三角阵;
lower = t(upper);
*单位阵;
I = I(3);
*纯量矩阵;
S = diag({10 10 10});
*单位元素1组成的矩阵;
J = J(2,5);
J = J(3,1);
*零元素组成的矩阵;
Z = J(2,5,0);
quit;
b.矩阵的基本运算
options nodate;
proc iml;
reset print log;
*加法和减法;
a = {1 2 3, 4 5 6};
b = {5 1 0, 3 -2 1};
c = {2 2 2, 1 1 1};
*对应元素相加;
d = a + b;
d = a + {1 3, 3 10};
*对应元素相减-- matrices are subtracted elementwise;
d = a - b;
*负数看成减法;
d = -a;
*矩阵加减的性质;
* a. 交换性: A + B = B + A;
print ( A + B ) ( B + A );
equal = all( (A + B) = (B + A) );
* b. 联合性: A + (B+C) = (A+B) + C;
print ( (A+B) + C ) ( A + (B+C) );
*矩阵与常数乘积;
d = 3 # A;
* 乘法分配律;
print ( 3 # (A + B) ) ( (3#A) + (3#B) );
*矩阵对应元素乘除法;
d = A # B;
d = A / 2;
quit;
c.逆矩阵性质
proc iml; reset print log fuzz;
A = {5 1 0, 3 -1 2, 4 0 -1};
r = det(A);
*行列式不等于0,矩阵逆存在;
AI = inv(A);
*矩阵预期逆乘积为单位阵;
r = AI * A;
*矩阵逆的逆矩阵等于该矩阵;
r = inv(AI);
*对称阵的逆矩阵是对称的;
r = inv( t(A) );
B = {4 2 2, 2 3 1, 2 1 3};
r = inv(B);
r = inv(t(B));
*对角阵的逆矩阵等于其各元素倒数组成的对角阵;
D =diag({ 1 2 4 });
r = inv(D);
r = diag(1 / {1 2 4});
*转置矩阵的逆等于逆的转置;
r = inv( t(A) );
r = t( inv(A) );
*常量与矩阵乘积的逆等于常量倒数乘以矩阵逆 ;
r = inv(5#A);
r = (1/5)#inv(A);
*矩阵乘积的逆等于逆的乘积:inv(A * B) = inv(B) * inv(A);
B = {1 2 3, 1 3 2, 2 4 1};
r = A * B;
r = inv(A * B);
r = (inv(B)) * (inv(A));
quit;
*行列式为0的矩阵的逆的情况;
proc iml;
reset print log fuzz fw=6;
*构造一个降序阵;
A = {4 4 -2, 4 4 -2, -2 -2 10};
r = det(A); *矩阵的行列式;
r = echelon(A);*初等行运算进行降为,A矩阵秩为2,没有一般的逆矩阵;
r = inv(A);
AI = ginv(A);*ginv函数产生广义逆矩阵;
*广义逆矩阵的性质;
r = A * AI * A;
r = AI * A * AI;
*A*AI和AI*A 都是对称的,但二者均不等于单位阵;
r = A * AI;
r = AI * A;
*对于矩形矩阵,如果(A'A)是(A'A)的广义逆矩阵,那么inv(A'A)*A'是矩阵A的广义逆矩阵;
A = J(4,1) || {1 0, 1 0, 0 1, 0 1};
AA= t(A) * A;
AAI= ginv(AA);
*矩阵A的广义逆矩阵是AAI * A';
AI = AAI * t(A);
r = A * AI * A;
r = AI * A * AI;
quit;
d.矩阵的秩与向量相关性
*矩阵的秩;
proc iml;
*1.定义函数R,用来计算矩阵A的秩;
start r(A);
reset noprint;
*矩阵秩行初等变换后非零行的数目;
e = echelon(A);
do i=1 to nrow(e); *找到不是所有元素都为0的行;
if any( e[i,] <> 0 ) then rows = rows || i;
end;
e = e[rows,]; *保留非0行;
do i=1 to ncol(e); *找到非零列;
if any( e[,i] <> 0 ) then cols = cols || i;
end;
e = e[,cols]; *保留非零列;
reset print;
return( min( nrow(e), ncol(e)) );
finish;
reset print log fuzz;
* 秩与线性相关;
X1 = {1 3 5};
X2 = {0 1 2};
X3 = {-1 4 9};
X4 = {2 2 2};
comb = (2#X1) + (-4#X2) + (0#X3) + -1#X4;
* X3, X4 是 X1, X2的线性组合;
print (t(X3)) '=' (t(-X1)) '+' (t(7#X2));
print (t(X4)) '=' (t(2#X1)) '+' (t(-4#X2));
* x1, x2, x3, x4中只有两个是独立的;
X = t(X1) || t(X2) || t(X3) || t(X4);*X是X1,X2,X3,X4的联合矩阵;
r = r(X); *调用定义函数,计算X的秩;
r = echelon(X); *X进行行初等变换;
X[3,4] = 4;*变换X的三行四列的元素;
r = r(X);
r = echelon(X);
skip 3; *log中空3行;
* -----------------------------------------------------;
* 2. 初等行运算计算矩阵秩;
A = {4 1 8, 5 2 7, 5 1 11, 8 3 12};
SAVE = A;
* ROW4 - 2#ROW 1;
A[4,] = A[4,] - 2#A[1,];
* Each elementary row operation is equivalent to premultiplication
by an identity matrix with the same operation applied to its rows;
T = I(4);
T[4,] = T[4,] - 2#T[1,];
A = T * SAVE;
* ROW 3 - ROW 2;
A[3,] = A[3,] - A[2,];
* .25 # ROW 1;
A[1,] = .25 # A[1,];
* ROW 2 - 5#ROW 1;
A[2,] = A[2,] - 5#A[1,];
* ROW 4 + 1#ROW 3;
A[4,] = A[4,] + A[3,];
* 1.33#ROW 2;
A[2,] = (4/3) # A[2,];
* ROW 2 + ROW 3;
A[2,] = A[2,] + A[3,];
*RANK = number of nonzero rows/cols;
r = r(A);
quit;
3.解方程组,函数R是求秩定义的函数(见上例)
*解方程组;
proc iml;
reset print log fuzz fw=5;
*1.三个等式三个未知数(齐次方程组);
A= {1 1 -4, 1 -2 1, 1 1 1};
b= {2, 1, 0};
xx = t('X1' : 'X3');
print A '*' xx '=' b;
print (r(A)) (r(A||b));* 齐次有:r(A) = r(A b);
*利用inv() or solve()函数解方程;
x = inv(A) * b;
x = solve(A,b);
print A ' * ' x '=' (A * x) '=' b;
r = echelon(A||b);*(A || b)初等行变换Echelon显示解放方程过程;
*2.四个等式三个未知数的方程组(齐次);
A= {1 1 -4, 1 -2 1, 1 1 1, 2 -1 2};
b= {2, 1, 0, 1};
print (r(A)) (r(A||b));*检验齐次:r(A) = r(A b);
*方程比未知数多,可以考虑广义逆矩阵ginv;
x = ginv(A) * b;
print A ' * ' x '=' (A * x) '=' b;
r = echelon(A||b);*初等行变换Echelon显示解放方程过程;
*3.三个等式三个未知数方程组(非齐次);
A={1 3 1, 1 -2 -2, 2 1 -1};
b={2,3,6};
print (r(A)) (r(A || b));*检验非齐次: r(A) < r(A b);
r = echelon(A||b);*初等行变换过程;
x = inv(A) * b;*由于A是奇异阵所有函数inv()失效;
x = ginv(A) * b;*考虑用广义逆矩阵函数解方程;
print A '*' x ' = ' (A * x);
*给定b向量,解方程组;
b = {2,3,5};
r = r(A||b);
r = echelon(A||b);
x = ginv(A) * b;
print A '*' x ' = ' (A * x) '=' b;
*等价解法2;
A11 = A[{1 2},{1 2}];
A12 = A[{1 2}, 3];
b1 = b[{1 2},];
x2 = -1.1;
x1 = inv(A11) * b1 - inv(A11) * A12 * x2;* 两个独立的未知变量的解;
quit;
4.特征值与特征向量
proc iml;
reset print log fuzz fw=5;
A={13 -4 2, -4 13 -2, 2 -2 10};
call eigen(values, vectors, A); *call eigen语句得到特征向量vectors,特征值value;
*特征值性质;
r = sum(values);*矩阵的迹等于所有特征值和;
r = sum(vecdiag(A));
*矩阵对应元素平方和等于特征值的平方和ssq(A) = ssq(eigenvalues);
print (ssq(A)) '=' (ssq(values));
print (det(A)) '=' (values[#]);*矩阵行列式等于特征值乘积;
*矩阵的秩等于非零特征值的个数;
r = echelon(A);
rank = (((echelon(A)^=0)[,+]) ^=0)[+,];
rank = sum(values ^= 0);
*逆矩阵的特征值等于矩阵特征值的倒数,但有相同的特征向量;
AI = inv(A);
call eigen(val, vec, AI);
* similar relation for other powers: roots(A##n) = (roots(A) ## n);
call eigen(val, vec, A*A);
call eigen(val, vec, A*A*A);
page;
*特征根与特征向量;
A={13 -4 2, -4 13 -2, 2 -2 10};
call eigen(L, V, A);
*1.向量与特征根的乘积等于特征根与其对应的特征向量的乘积;
r = A * V[,1];
r = L[1] # V[,1];
print A '*' (V[,1]) '=' (A*V[,1]) '=' (L[1]) '#' (V[,1]);
r = A * V;
r = V * diag(L);
print A '*' V '=' V '*' (diag(L)) ;
*利用特征值对矩阵进行对角化: V'AV = diagonal;
r = t(V) * A * V;
*2.特征向量系正交的,且其与转置阵的乘积为单位阵V'V=I;
r = t(V) * V;
*3.矩阵的谱分析: A = sum of rank 1 products;
A1 = L[1] # V[,1] * t(V[,1]);
A2 = L[2] # V[,2] * t(V[,2]);
A3 = L[3] # V[,3] * t(V[,3]);
r = A1 + A2 + A3;
r = ssq(A);
r = ssq(A1) || ssq(A2) || ssq(A3);
*-- Each root is sum of squares accounted for;
r = L##2;
*--The first i roots and vectors give a rank i approximation;
r = echelon(A1+A2);
r = ssq(A1+A2);
quit;
参考:《线性代数》同济大学第四版
代码摘自http://www.yorku.ca/health/psyc/