神奇的矩阵表达式运算工具
下载 http://cmd1152.ys168.com/ 文件区 矩阵表达式计算器.zip
MAT.EXE
摘要:
=============================================================================
矩阵表达式计算器,支持矩阵四则运算,乘方运算计算。
=============================================================================
用法:
-----------------------------------------------------------------------------
mat "[expression1] [expression2] [expression3] [.] ..."
-----------------------------------------------------------------------------
示例:
-----------------------------------------------------------------------------
mat "[A=1,0;1,1] [B=A^(2)] [C=A^(-1)+B] [(A^(-1))-C] [det(A)]"
-----------------------------------------------------------------------------
输入格式:
{E = en(2)} <==> [1 0]
[0 1]
{A = 1,,2;3,8,7} <==> [1 0 2]
[3 8 7]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
矩阵函数:
+, -, *, ^, A^(-1), A^(n), cp(A), rot(A), en(A)
gs(A), diag(A), lad(A), tri(A)
tr(A), r(A), det(A)
lf(n): 控制精度
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
常数类
pi 3.1415926535897932
e 2.7182818284590452
通用类
+ 加
- 减
* 乘
/ 除
% 取余数
^ 次方
rand 随机数
round 四舍五入
int 取整
ceil 向上舍入
floor 向下舍入
sqrt 开方
lg 常用对数,以10为底
ln 自然对数
exp e的次幂
deg 度转弧度
三角函数类
sin、cos、tan
arcsin、arccos、arctan
双曲函数类
sinh、cosh、tanh
arcsinh、arccosh、arctanh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
英译:
The matrix calculator, Copyright@2021~2023 Slimay
usage:
mat "[expression1] [expression2] [expression3] [.] ..."
example:
mat "[A=1,0;1,1] [B=A^(2)] [C=A^(-1)+B] [(A^(-1))-C] [det(A
You can use the letters A to O to name the matrix
{E = en(2)} <==> [1 0]
[0 1]
{A = 1,,2;3,8,7} <==> [1 0 2]
[3 8 7]
matrix functions:
+, -, *, ^, A^(-1), A^(n), cp(A), rot(A), en(A)
gs(A), diag(A), lad(A), tri(A)
tr(A), r(A), det(A)
lf(n): control print precision
mathematical function:
pi = 3.1415, e = 2.7182, rand, abs, sqrt, lg, ln, exp
sin, cos, tan, arcsin, arccos, arctan
version 1.0.5
COPYRIGHT@2021~2023 BY SLIMAY, VERSION 1.0
MAT.EXE
核心代码 | | | Matrix* Gauss_Jordan_Elimination(Matrix* mat, int eliminateMode) | | { | | int eliminateModeBak = eliminateMode; | | | | if(eliminateMode == ELIMINATE_INVERSE2) | | { | | eliminateMode = ELIMINATE_INVERSE; | | } | | | | if(eliminateMode == ELIMINATE_GET_DET) | | { | | eliminateMode = ELIMINATE_TRIANGLE; | | } | | | | | | int n1 = ( *(mat + 0) ); | | | | int m1 = ( *(mat + 1) ); | | | | | | | | if(n1 <2 || m1 < 2) | | { | | PRINTF_ERROR("The 1-order matrix can't run this.\n", ""); | | exit(1); | | return real_matrix(1.0f / (*(mat + 2))); | | } | | | | | | Matrix* mat1 = (Matrix *)calloc(n1 * m1 + MAT_PRELEN, sizeof(double)); | | memcpy(mat1, mat, sizeof(double) * (n1 * m1 + MAT_PRELEN) ); | | | | | | double exChangeLineTmp[MAX_LEN]; | | | | Matrix* matInverse = NULL; | | | | if(eliminateMode == ELIMINATE_INVERSE) | | { | | | | matInverse = (Matrix *)calloc(n1 * m1 + MAT_PRELEN, sizeof(double)); | | | | *(matInverse + 0) = (double)n1; | | *(matInverse + 1) = (double)m1; | | | | for(int i = 0; i < GET_MIN(n1, m1); i++) | | { | | *(matInverse + MAT_PRELEN + i + i * n1) = 1.0f; | | } | | } | | | | | | int exChangeTimes = 0; | | | | int i = 0, j = 0, j_start = 0; | | for(i = 0; i < GET_MIN(n1, m1); i++) | | { | | for(j = j_start; (j < m1) && (i < n1); j++) | | { | | | | if( (*(mat1 + MAT_PRELEN + i + j_start * n1)) != 0) | | { | | break; | | } | | | | if( (*(mat1 + MAT_PRELEN + i + j*n1) != 0) && (j != j_start)) | | { | | | | memcpy(exChangeLineTmp, mat1 + MAT_PRELEN + j*n1, n1 * sizeof(double)); | | | | memcpy(mat1 + MAT_PRELEN + j * n1, mat1 + MAT_PRELEN + i * n1, n1 * sizeof(double)); | | memcpy(mat1 + MAT_PRELEN + i * n1, exChangeLineTmp, n1 * sizeof(double)); | | | | | | if(eliminateMode == ELIMINATE_INVERSE) | | { | | memcpy(exChangeLineTmp, matInverse + MAT_PRELEN + j*n1, n1 * sizeof(double)); | | | | memcpy(matInverse + MAT_PRELEN + j * n1, matInverse + MAT_PRELEN + i * n1, n1 * sizeof(double)); | | memcpy(matInverse + MAT_PRELEN + i * n1, exChangeLineTmp, n1 * sizeof(double)); | | } | | | | exChangeTimes ++; | | break; | | } | | } | | | | | | if((j == m1) && (*(mat1 + MAT_PRELEN + i + j_start * n1) == 0)) | | { | | | | if((eliminateModeBak != ELIMINATE_LADDER)) | | { | | j_start ++; | | } | | continue; | | } | | | | | | if( (*(mat1 + MAT_PRELEN + i + j_start * n1)) != 0) | | { | | | | if((eliminateMode == ELIMINATE_INVERSE)) | | { | | | | double mainPara = (*(mat1 + MAT_PRELEN + i + j_start*n1)); | | for(int k = i; k < n1; k++) | | { | | (*(mat1 + MAT_PRELEN + k + j_start*n1)) /= mainPara; | | | | | | _ZERO_( *(mat1 + MAT_PRELEN + k + j_start*n1) ); | | } | | | | if(eliminateMode == ELIMINATE_INVERSE) | | { | | for(int k = 0; k < n1; k++) | | { | | (*(matInverse + MAT_PRELEN + k + j_start*n1)) /= mainPara; | | | | | | _ZERO_( *(matInverse + MAT_PRELEN + k + j_start*n1) ); | | } | | } | | } | | } | | | | | | for(j = ( (eliminateMode==ELIMINATE_DIAG) || (eliminateMode==ELIMINATE_INVERSE) )?0 :(j_start + 1); (j < m1) && (i < n1); j++) | | { | | | | if(j == j_start) | | { | | continue; | | } | | | | | | double disLinePara = - (*(mat1 + MAT_PRELEN + i + j*n1)) / (*(mat1 + MAT_PRELEN + i + j_start*n1)); | | | | | | for(int k = i; k < n1; k++) | | { | | (*(mat1 + MAT_PRELEN + k + j*n1)) += disLinePara * (*(mat1 + MAT_PRELEN + k + j_start*n1)); | | | | | | _ZERO_(*(mat1 + MAT_PRELEN + k + j*n1)); | | } | | | | | | if(eliminateMode == ELIMINATE_INVERSE) | | { | | | | double disLineParaInverse = disLinePara ; | | | | | | for(int k = ((eliminateMode==ELIMINATE_DIAG) || (eliminateMode==ELIMINATE_INVERSE) ?0 :i); k < n1; k++) | | { | | (*(matInverse + MAT_PRELEN + k + j*n1)) += disLineParaInverse * (*(matInverse + MAT_PRELEN + k + j_start*n1)); | | | | _ZERO_( *(matInverse + MAT_PRELEN + k + j*n1) ); | | } | | } | | } | | | | | | j_start ++; | | } | | | | | | if(eliminateModeBak == ELIMINATE_GET_DET) | | { | | double detValue = 1.0f; | | for(int j = 0; j < m1; j++) | | { | | detValue *= (*(mat1 + MAT_PRELEN + j + j*m1)); | | } | | | | | | _ZERO_(detValue); | | | | | | free(mat1); | | | | | | return real_matrix(detValue); | | } | | | | | | if(eliminateModeBak == ELIMINATE_INVERSE) | | { | | | | for(int j = 0; j < n1; j++) | | { | | double mPara = (*(mat1 + MAT_PRELEN + j + j*n1)); | | if( mPara == 0.0f ) | | { | | PRINTF_ERROR("The matrix has no inverse mat.\n", ""); | | exit(1); | | } | | } | | | | | | free(mat1); | | return matInverse; | | } | | | | | | if(eliminateModeBak == ELIMINATE_INVERSE2) | | { | | free(matInverse); | | return mat1; | | } | | | | | | return mat1; | | } COPY |
|