| 赞 | 3 |
| VIP | |
| 好人卡 | |
| 积分 | 10 |
| 经验 | |
| 最后登录 | 2026-7-17 |
| 在线时间 | 1391 小时 |
寒
- 梦石
- 0
- 星屑
- 1049
- 在线时间
- 1391 小时
- 注册时间
- 2010-8-9
- 回帖
- 3301
|
发表于 2016-9-17 01:17:50
|
显示全部楼层
本帖最后由 寒冷魔王 于 2016-9-17 01:45 编辑
哇,小叶子也做这个了呢~
前排支持!
另外,看你使用一维数组作为矩阵处理的话,可以考虑写一些对应的函数哦~
- double A[n*n];//第j列第i行写作A[j*n + i]
- // 写成:
- double getMatrixElement(double matrix[], int i, int j) // 按照习惯交换j和i的位置,根据你的注释,j表示列,i表示行,数学上的习惯是a(i j)
- {
- return matrix[j*n + i];
- }
- void setMatrixElement(double matrix[], int i, int j, double element)
- {
- matrix[j*n + i] = element;
- }
复制代码
用法:
double A[n * n];
v = getMatrixElement(A, i, j);
setMatrixElement(A, i, j, v);
这样写不容易出错,只要把i和j的位置对应好就行了~
============================以下内容可以无视==============================
小叶子你的写法呢,double A[n*n]; 其实是C99的标准,这个n是变量。
如果要用C++(兼容C89但不兼容C99)编译呢,最好写成
- double *A = (double*)calloc(n*n, sizeof(double)); // 用calloc的话不用手动清零。
复制代码
当然需要用完后free才行。
建议使用struct来表示Matrix
- struct Matrix
- {
- double *data;
- };
复制代码
用struct Matrix代替double[]的好处是不会和其他的double[]弄混,而且能够直接复制struct Matrix哦~
- void initMatrix(struct Matrix *matrix, int n)
- {
- matrix->data = (double*)calloc(n*n, sizeof(double));
- }
- void freeMatrix(struct Matrix *matrix)
- {
- free(matrix->data);
- }
- double getMatrixElement(struct Matrix *matrix, int i, int j)
- {
- return matrix->data[j*n + i];
- }
- void setMatrixElement(struct Matrix *matrix, int i, int j, double element)
- {
- matrix->data[j*n + i] = element;
- }
-
复制代码
使用方法是
struct Matrix A;
initMatrix(&A, n); // 初始化
v = getMatrixElement(&A, i, j); // 获取 v = A(i j)
setMatrixElement(&A, i, j, v); // 设置 A(i j) = v
freeMatrix(&A); // 释放
如果在struct Matrix内加个变量储存矩阵大小,还可以顺便检查其访问元素是否越界。
- struct Matrix
- {
- double *data;
- int size;
- };
复制代码
更好一些的代码:
- void initMatrix(struct Matrix *matrix, int n)
- {
- matrix->data = (double*)calloc(n*n, sizeof(double));
- matrix->size = n;
- }
- void freeMatrix(struct Matrix *matrix)
- {
- free(matrix->data);
- }
- double getMatrixElement(struct Matrix *matrix, int i, int j)
- {
- assert(i >= 0 && matrix->size > i && j >= 0 && matrix->size > j);
- return matrix->data[j*n + i];
- }
- void setMatrixElement(struct Matrix *matrix, int i, int j, double element)
- {
- assert(i >= 0 && matrix->size > i && j >= 0 && matrix->size > j);
- matrix->data[j*n + i] = element;
- }
-
复制代码
其中,getMatrixElement和setMatrixElement新增的assert会在Debug模式下检查不符合表达式的错误,自动结束程序。
它检查的是 i 和 j 在 [0,matrix->size) 的区间内。
assert用于检查编程错误,比如循环时不小心多了1次,越界了之类的。不要用assert判断程序需要处理的错误。
这个assert在非Debug模式下会去除,GCC中,使用NDEBUG用于去除assert。
因为assert会去除,所以不要在assert中写能够改变程序状态的代码,如
assert(i++);
这会导致程序的行为不一致。
|
评分
-
查看全部评分
|