2021-10-30

第一次听说proc iml,就学习记录一下

1.行列式


   
   
  1. *行列式特征;
  2. proc iml; reset print log;
  3. A = {3 1, 2 4};
  4. r = det(A); *行列式的值;
  5. r = det(A[{2 1},]);*交换行列式的行行列式变号;
  6. r = det(A[,{2 1}]);*交换行列式的列行列式变号;
  7. r = det( t(A) );*行列式与它的转置行列式相等;
  8. *行列式的某行/列所有元素乘以K等于K乘以该行列式;
  9. r = diag({3 1}) * A;
  10. r = det( diag({3 1}) * A);
  11. *矩阵乘以K的行列式,等于K的n方乘以该矩阵行列式;
  12. r = det(3 # A);
  13. *方阵乘积的行列式等于两方阵行列式的乘积;
  14. B={ 4 2, 3 5};
  15. r = det(B);
  16. r = det(A * B);
  17. r = det(A) # det(B);
  18. *行列式中行列成比例,则行列式值为0;
  19. C={1 5, 2 6, 4 4};
  20. C=C || C[,1];
  21. r = det(C);
  22. *把行列式某一列/行的各元素乘以同一数后加到另一列/行
  23. 对应元素上去,行列式不变;
  24. A[2,] = A[2,] - 2#A[1,];
  25. r = det(A);
  26. quit;
  27. *行列式求值;
  28. proc iml;
  29. reset print log;
  30. *计算行列式的余子式;
  31. start cofactor(A,i,j);
  32. reset noprint;
  33. size = nrow(A); *矩阵维度;
  34. rows = loc( (1:size) ^= i ); *删除第i行,loc函数用来生成由非零元素位置组成的行向量;
  35. cols = loc( (1:size) ^= j ); *删除第j列;
  36. minor = det( A[rows,cols] );
  37. reset print;
  38. return ( ((-1)##(i+j)) # minor );
  39. finish;
  40. *行列式按余子式展开;
  41. A ={4 2 1, 5 6 7, 1 0 3};
  42. r = det(A);
  43. *按照第一行的余子式展开cofactors of row 1 elements;
  44. print (cofactor(A,1,1)) (A[{2 3},{2 3}]);
  45. print (cofactor(A,1,2)) (A[{2 3},{1 3}]);
  46. print (cofactor(A,1,3)) (A[{2 3},{1 2}]);
  47. *行列式等于行元素与其余子式的乘积和
  48. det = product of row with cofactors;
  49. r = A[1,] * {18, -8, -6};
  50. *行列式按照高斯消元法求值;
  51. M = {2 3 1 2, 4 2 3 4, 1 4 2 2, 3 1 0 1};
  52. d = det(M);
  53. *以M[1,1]为主元素进行消元,行列式等于各主元素的乘积;
  54. D=M[1,1];
  55. *首先消掉第一行,第一列同时被消掉;
  56. M[1,] = M[1,] / M[1,1];
  57. M = M - M[,1] * M[1,];
  58. *剩下2、3、4行列组成新的行列式;
  59. M = M[{2 3 4},{2 3 4}];
  60. *主元素进行累积;
  61. D = D # M[1,1];
  62. *重复上述消元过程;
  63. M[1,] = M[1,] / M[1,1];
  64. M = M - M[,1] * M[1,];
  65. M = M[{2 3},{2 3}];
  66. D = D # M[1,1];
  67. *再一次消元,等到行列式值d = det(m);
  68. M[1,] = M[1,] / M[1,1];
  69. M = M - M[,1] * M[1,];
  70. M = M[2,2];
  71. D = D # M[1,1];
  72. quit;

 

2.矩阵

a.基本的矩阵


   
   
  1. *基本的矩阵;
  2. options nodate;
  3. proc iml;
  4. reset print log;
  5. *一般矩阵;
  6. X = {1 2 3, 4 0 6, 9 1 4, 6 2 4};
  7. print (nrow(X)) (ncol(X));
  8. rowvec = { 1 2 3};
  9. colvec = { 1, 4, 6};
  10. *矩阵转置;
  11. xt = t(x);
  12. xt = t(x);
  13. *方阵;
  14. A = {5 -1 3, -1 4 7, 3 3 -4};
  15. *对角线元素组成的列向量:vecdiag函数;
  16. d = vecdiag(A);
  17. *对角阵;
  18. d = diag({1 4 9});
  19. *矩阵的迹:对角元素之和;
  20. t = trace(A);
  21. *对称阵;
  22. sym = ( A = t(A) );
  23. sym = all( A = t(A) );
  24. *方阵性质;
  25. B = ( A + t(A) ) / 2;
  26. sym = all( B = t(B));
  27. *上三角阵;
  28. upper = {-5 2 7, 0 -2 4, 0 0 3};
  29. *下三角阵;
  30. lower = t(upper);
  31. *单位阵;
  32. I = I(3);
  33. *纯量矩阵;
  34. S = diag({10 10 10});
  35. *单位元素1组成的矩阵;
  36. J = J(2,5);
  37. J = J(3,1);
  38. *零元素组成的矩阵;
  39. Z = J(2,5,0);
  40. quit;

b.矩阵的基本运算


   
   
  1. options nodate;
  2. proc iml;
  3. reset print log;
  4. *加法和减法;
  5. a = {1 2 3, 4 5 6};
  6. b = {5 1 0, 3 -2 1};
  7. c = {2 2 2, 1 1 1};
  8. *对应元素相加;
  9. d = a + b;
  10. d = a + {1 3, 3 10};
  11. *对应元素相减-- matrices are subtracted elementwise;
  12. d = a - b;
  13. *负数看成减法;
  14. d = -a;
  15. *矩阵加减的性质;
  16. * a. 交换性: A + B = B + A;
  17. print ( A + B ) ( B + A );
  18. equal = all( (A + B) = (B + A) );
  19. * b. 联合性: A + (B+C) = (A+B) + C;
  20. print ( (A+B) + C ) ( A + (B+C) );
  21. *矩阵与常数乘积;
  22. d = 3 # A;
  23. * 乘法分配律;
  24. print ( 3 # (A + B) ) ( (3#A) + (3#B) );
  25. *矩阵对应元素乘除法;
  26. d = A # B;
  27. d = A / 2;
  28. quit;

c.逆矩阵性质


   
   
  1. proc iml; reset print log fuzz;
  2. A = {5 1 0, 3 -1 2, 4 0 -1};
  3. r = det(A);
  4. *行列式不等于0,矩阵逆存在;
  5. AI = inv(A);
  6. *矩阵预期逆乘积为单位阵;
  7. r = AI * A;
  8. *矩阵逆的逆矩阵等于该矩阵;
  9. r = inv(AI);
  10. *对称阵的逆矩阵是对称的;
  11. r = inv( t(A) );
  12. B = {4 2 2, 2 3 1, 2 1 3};
  13. r = inv(B);
  14. r = inv(t(B));
  15. *对角阵的逆矩阵等于其各元素倒数组成的对角阵;
  16. D =diag({ 1 2 4 });
  17. r = inv(D);
  18. r = diag(1 / {1 2 4});
  19. *转置矩阵的逆等于逆的转置;
  20. r = inv( t(A) );
  21. r = t( inv(A) );
  22. *常量与矩阵乘积的逆等于常量倒数乘以矩阵逆 ;
  23. r = inv(5#A);
  24. r = (1/5)#inv(A);
  25. *矩阵乘积的逆等于逆的乘积:inv(A * B) = inv(B) * inv(A);
  26. B = {1 2 3, 1 3 2, 2 4 1};
  27. r = A * B;
  28. r = inv(A * B);
  29. r = (inv(B)) * (inv(A));
  30. quit;
  31. *行列式为0的矩阵的逆的情况;
  32. proc iml;
  33. reset print log fuzz fw=6;
  34. *构造一个降序阵;
  35. A = {4 4 -2, 4 4 -2, -2 -2 10};
  36. r = det(A); *矩阵的行列式;
  37. r = echelon(A);*初等行运算进行降为,A矩阵秩为2,没有一般的逆矩阵;
  38. r = inv(A);
  39. AI = ginv(A);*ginv函数产生广义逆矩阵;
  40. *广义逆矩阵的性质;
  41. r = A * AI * A;
  42. r = AI * A * AI;
  43. *A*AI和AI*A 都是对称的,但二者均不等于单位阵;
  44. r = A * AI;
  45. r = AI * A;
  46. *对于矩形矩阵,如果(A'A)是(A'A)的广义逆矩阵,那么inv(A'A)*A'是矩阵A的广义逆矩阵;
  47. A = J(4,1) || {1 0, 1 0, 0 1, 0 1};
  48. AA= t(A) * A;
  49. AAI= ginv(AA);
  50. *矩阵A的广义逆矩阵是AAI * A';
  51. AI = AAI * t(A);
  52. r = A * AI * A;
  53. r = AI * A * AI;
  54. quit;

d.矩阵的秩与向量相关性


   
   
  1. *矩阵的秩;
  2. proc iml;
  3. *1.定义函数R,用来计算矩阵A的秩;
  4. start r(A);
  5. reset noprint;
  6. *矩阵秩行初等变换后非零行的数目;
  7. e = echelon(A);
  8. do i=1 to nrow(e); *找到不是所有元素都为0的行;
  9. if any( e[i,] <> 0 ) then rows = rows || i;
  10. end;
  11. e = e[rows,]; *保留非0行;
  12. do i=1 to ncol(e); *找到非零列;
  13. if any( e[,i] <> 0 ) then cols = cols || i;
  14. end;
  15. e = e[,cols]; *保留非零列;
  16. reset print;
  17. return( min( nrow(e), ncol(e)) );
  18. finish;
  19. reset print log fuzz;
  20. * 秩与线性相关;
  21. X1 = {1 3 5};
  22. X2 = {0 1 2};
  23. X3 = {-1 4 9};
  24. X4 = {2 2 2};
  25. comb = (2#X1) + (-4#X2) + (0#X3) + -1#X4;
  26. * X3, X4 是 X1, X2的线性组合;
  27. print (t(X3)) '=' (t(-X1)) '+' (t(7#X2));
  28. print (t(X4)) '=' (t(2#X1)) '+' (t(-4#X2));
  29. * x1, x2, x3, x4中只有两个是独立的;
  30. X = t(X1) || t(X2) || t(X3) || t(X4);*X是X1,X2,X3,X4的联合矩阵;
  31. r = r(X); *调用定义函数,计算X的秩;
  32. r = echelon(X); *X进行行初等变换;
  33. X[3,4] = 4;*变换X的三行四列的元素;
  34. r = r(X);
  35. r = echelon(X);
  36. skip 3; *log中空3行;
  37. * -----------------------------------------------------;
  38. * 2. 初等行运算计算矩阵秩;
  39. A = {4 1 8, 5 2 7, 5 1 11, 8 3 12};
  40. SAVE = A;
  41. * ROW4 - 2#ROW 1;
  42. A[4,] = A[4,] - 2#A[1,];
  43. * Each elementary row operation is equivalent to premultiplication
  44. by an identity matrix with the same operation applied to its rows;
  45. T = I(4);
  46. T[4,] = T[4,] - 2#T[1,];
  47. A = T * SAVE;
  48. * ROW 3 - ROW 2;
  49. A[3,] = A[3,] - A[2,];
  50. * .25 # ROW 1;
  51. A[1,] = .25 # A[1,];
  52. * ROW 2 - 5#ROW 1;
  53. A[2,] = A[2,] - 5#A[1,];
  54. * ROW 4 + 1#ROW 3;
  55. A[4,] = A[4,] + A[3,];
  56. * 1.33#ROW 2;
  57. A[2,] = (4/3) # A[2,];
  58. * ROW 2 + ROW 3;
  59. A[2,] = A[2,] + A[3,];
  60. *RANK = number of nonzero rows/cols;
  61. r = r(A);
  62. quit;

 

3.解方程组,函数R是求秩定义的函数(见上例)


   
   
  1. *解方程组;
  2. proc iml;
  3. reset print log fuzz fw=5;
  4. *1.三个等式三个未知数(齐次方程组);
  5. A= {1 1 -4, 1 -2 1, 1 1 1};
  6. b= {2, 1, 0};
  7. xx = t('X1' : 'X3');
  8. print A '*' xx '=' b;
  9. print (r(A)) (r(A||b));* 齐次有:r(A) = r(A b);
  10. *利用inv() or solve()函数解方程;
  11. x = inv(A) * b;
  12. x = solve(A,b);
  13. print A ' * ' x '=' (A * x) '=' b;
  14. r = echelon(A||b);*(A || b)初等行变换Echelon显示解放方程过程;
  15. *2.四个等式三个未知数的方程组(齐次);
  16. A= {1 1 -4, 1 -2 1, 1 1 1, 2 -1 2};
  17. b= {2, 1, 0, 1};
  18. print (r(A)) (r(A||b));*检验齐次:r(A) = r(A b);
  19. *方程比未知数多,可以考虑广义逆矩阵ginv;
  20. x = ginv(A) * b;
  21. print A ' * ' x '=' (A * x) '=' b;
  22. r = echelon(A||b);*初等行变换Echelon显示解放方程过程;
  23. *3.三个等式三个未知数方程组(非齐次);
  24. A={1 3 1, 1 -2 -2, 2 1 -1};
  25. b={2,3,6};
  26. print (r(A)) (r(A || b));*检验非齐次: r(A) < r(A b);
  27. r = echelon(A||b);*初等行变换过程;
  28. x = inv(A) * b;*由于A是奇异阵所有函数inv()失效;
  29. x = ginv(A) * b;*考虑用广义逆矩阵函数解方程;
  30. print A '*' x ' = ' (A * x);
  31. *给定b向量,解方程组;
  32. b = {2,3,5};
  33. r = r(A||b);
  34. r = echelon(A||b);
  35. x = ginv(A) * b;
  36. print A '*' x ' = ' (A * x) '=' b;
  37. *等价解法2;
  38. A11 = A[{1 2},{1 2}];
  39. A12 = A[{1 2}, 3];
  40. b1 = b[{1 2},];
  41. x2 = -1.1;
  42. x1 = inv(A11) * b1 - inv(A11) * A12 * x2;* 两个独立的未知变量的解;
  43. quit;

 

4.特征值与特征向量


   
   
  1. proc iml;
  2. reset print log fuzz fw=5;
  3. A={13 -4 2, -4 13 -2, 2 -2 10};
  4. call eigen(values, vectors, A); *call eigen语句得到特征向量vectors,特征值value;
  5. *特征值性质;
  6. r = sum(values);*矩阵的迹等于所有特征值和;
  7. r = sum(vecdiag(A));
  8. *矩阵对应元素平方和等于特征值的平方和ssq(A) = ssq(eigenvalues);
  9. print (ssq(A)) '=' (ssq(values));
  10. print (det(A)) '=' (values[#]);*矩阵行列式等于特征值乘积;
  11. *矩阵的秩等于非零特征值的个数;
  12. r = echelon(A);
  13. rank = (((echelon(A)^=0)[,+]) ^=0)[+,];
  14. rank = sum(values ^= 0);
  15. *逆矩阵的特征值等于矩阵特征值的倒数,但有相同的特征向量;
  16. AI = inv(A);
  17. call eigen(val, vec, AI);
  18. * similar relation for other powers: roots(A##n) = (roots(A) ## n);
  19. call eigen(val, vec, A*A);
  20. call eigen(val, vec, A*A*A);
  21. page;
  22. *特征根与特征向量;
  23. A={13 -4 2, -4 13 -2, 2 -2 10};
  24. call eigen(L, V, A);
  25. *1.向量与特征根的乘积等于特征根与其对应的特征向量的乘积;
  26. r = A * V[,1];
  27. r = L[1] # V[,1];
  28. print A '*' (V[,1]) '=' (A*V[,1]) '=' (L[1]) '#' (V[,1]);
  29. r = A * V;
  30. r = V * diag(L);
  31. print A '*' V '=' V '*' (diag(L)) ;
  32. *利用特征值对矩阵进行对角化: V'AV = diagonal;
  33. r = t(V) * A * V;
  34. *2.特征向量系正交的,且其与转置阵的乘积为单位阵V'V=I;
  35. r = t(V) * V;
  36. *3.矩阵的谱分析: A = sum of rank 1 products;
  37. A1 = L[1] # V[,1] * t(V[,1]);
  38. A2 = L[2] # V[,2] * t(V[,2]);
  39. A3 = L[3] # V[,3] * t(V[,3]);
  40. r = A1 + A2 + A3;
  41. r = ssq(A);
  42. r = ssq(A1) || ssq(A2) || ssq(A3);
  43. *-- Each root is sum of squares accounted for;
  44. r = L##2;
  45. *--The first i roots and vectors give a rank i approximation;
  46. r = echelon(A1+A2);
  47. r = ssq(A1+A2);
  48. quit;


 参考:《线性代数》同济大学第四版

代码摘自http://www.yorku.ca/health/psyc/

 


 





 

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值