|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int row, line; //line为行,row为列
double *data;
}Matrix;
Matrix* InitMatrix(Matrix *matrix, int row, int line); //初始化矩阵
void ValueMatrix(Matrix *matrix, double *array); //给一个矩阵赋值
int SizeMatrix(Matrix *matrix); //获得一个矩阵的大小
void FreeMatrix(Matrix *matrix); //释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);
void PrintMatrix(Matrix *matrix); //打印一个矩阵
//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的乘法
void TransMatrix(Matrix *matrix); //条件为方阵
int main(int argc, char* argv[])
{
double value[] = { 1,2,3,4,5,6,7,8,9 };
double value2[] = { 9,8,7,6,5,4,3,2,1 };
Matrix *matrix1 = InitMatrix(matrix1, 3, 3); (1) //显示matrix1未初始化 (1)
Matrix *matrix2 = InitMatrix(matrix2, 3, 3); (2)//显示matrix2未初始化 (2)
ValueMatrix(matrix1, value);
// CopyMatrix(matrix1,matrix2); //复制赋值
ValueMatrix(matrix2, value2);
printf("矩阵1 乘以 矩阵2: \n");
Matrix *matrix3 = MulMatrix(matrix1, matrix2); //乘法
PrintMatrix(matrix3);
return 0;
}
void ValueMatrix(Matrix *matrix, double *array) //给矩阵赋值
{
if (matrix->data != NULL)
{
memcpy(matrix->data, array, matrix->row*matrix->line * sizeof(double));
}
}
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
matrix_B->row = matrix_A->row;
matrix_B->line = matrix_A->line;
memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A) * sizeof(double));
}
Matrix* InitMatrix(Matrix *matrix, int row, int line) //初始化一个矩阵
{
if (row > 0 && line > 0)
{
matrix = (Matrix*)malloc(sizeof(Matrix));
matrix->row = row;
matrix->line = line;
matrix->data = (double*)malloc(sizeof(double)*row*line);
return matrix;
}
else
return NULL;
}
void PrintMatrix(Matrix *matrix)
{
for (int i = 0; i < SizeMatrix(matrix); i++)
{
printf("%lf\t", matrix->data);
if ((i + 1) % matrix->line == 0)
printf("\n");
}
}
//乘法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
if (matrix_A->row == matrix_B->line) //列==行
{
Matrix *matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); (3) //matrix_C未初始化 (3)
// matrix_C->line = matrix_A->line; //A行
// matrix_C->row = matrix_B->row; //B列
for (int i = 0; i < matrix_A->row; i++)
{
for (int j = 0; j < matrix_B->line; j++)
{
for (int k = 0; k < matrix_A->line; k++)
{
matrix_C->data[i*matrix_C->line + j] += matrix_A->data[i*matrix_A->line + k] * matrix_B->data[k*matrix_B->row + j];
}
}
}
return matrix_C;
}
else
{
printf("不可相乘\n");
return NULL;
}
}
上面程序中的(1)(2)(3)该如何修改(文中标出了(1)(2)(3)),主函数里面的(1)(2),乘法函数里面的(3)
谢谢!
完整连接如下
https://blog.csdn.net/Beking17113/article/details/100547735
本帖最后由 耻思lhj 于 2020-4-16 18:48 编辑
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct
- {
- int row, line; //line为行,row为列
- double *data;
- }Matrix;
- Matrix* InitMatrix(Matrix *matrix, int row, int line); //初始化矩阵
- void ValueMatrix(Matrix *matrix, double *array); //给一个矩阵赋值
- int SizeMatrix(Matrix *matrix); //获得一个矩阵的大小
- void FreeMatrix(Matrix *matrix); //释放一个矩阵
- void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);
- void PrintMatrix(Matrix *matrix); //打印一个矩阵
- //矩阵的基本运算
- Matrix* AddMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的加法
- Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的乘法
- void TransMatrix(Matrix *matrix); //条件为方阵
- int main(int argc, char* argv[])
- {
- double value[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
- double value2[9] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
- Matrix *matrix1 = NULL;
- matrix1 = InitMatrix(matrix1, 3, 3); //显示matrix1未初始化 (1)
- Matrix *matrix2 = NULL;
- matrix2 = InitMatrix(matrix2, 3, 3); //显示matrix2未初始化 (2)
- ValueMatrix(matrix1, value);
- // CopyMatrix(matrix1,matrix2); //复制赋值
- ValueMatrix(matrix2, value2);
- printf("矩阵1 乘以 矩阵2: \n");
- Matrix *matrix3 = MulMatrix(matrix1, matrix2); //乘法
- PrintMatrix(matrix3);
- getchar();
- return 0;
- }
- void ValueMatrix(Matrix *matrix, double *array) //给矩阵赋值
- {
- int i;
- if (matrix->data != NULL)
- {
- memcpy(matrix->data, array, matrix->row*matrix->line * sizeof(double));
- }
- }
- int SizeMatrix(Matrix *matrix)
- {
- return matrix->row*matrix->line;
- }
- void FreeMatrix(Matrix *matrix)
- {
- free(matrix->data); //释放掉矩阵的data存储区
- if (matrix->data == NULL)
- printf("释放成功\n");
- else
- printf("释放失败\n");
- }
- void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
- {
- matrix_B->row = matrix_A->row;
- matrix_B->line = matrix_A->line;
- memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A) * sizeof(double));
- }
- Matrix* InitMatrix(Matrix *matrix, int row, int line) //初始化一个矩阵
- {
- double value3[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- if (row > 0 && line > 0)
- {
- matrix = (Matrix*)malloc(sizeof(Matrix));
- matrix->row = row;
- matrix->line = line;
- matrix->data = (double*)malloc(sizeof(double)*row*line);
- ValueMatrix(matrix,value3);
- return matrix;
- }
- else
- return NULL;
- }
- void PrintMatrix(Matrix *matrix)
- {
- int i;
- for (i = 0; i < SizeMatrix(matrix); i++)
- {
- printf("%lf\t", matrix->data[i]);
- if ((i + 1) % matrix->line == 0)
- printf("\n");
- }
- }
- //乘法
- Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B)
- {
- int i, j, k;
- if (matrix_A->row == matrix_B->line) //列==行
- {
- Matrix *matrix_C = NULL;
- matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); //matrix_C未初始化 (3)
- // matrix_C->line = matrix_A->line; //A行
- // matrix_C->row = matrix_B->row; //B列
- for (i = 0; i < matrix_A->row; i++)
- {
- for (j = 0; j < matrix_B->line; j++)
- {
- for (k = 0; k < matrix_A->line; k++)
- {
- matrix_C->data[i*matrix_C->line + j] += matrix_A->data[i*matrix_A->line + k] * matrix_B->data[k*matrix_B->row + j];
- }
- }
- }
- return matrix_C;
- }
- else
- {
- printf("不可相乘\n");
- return NULL;
- }
- }
复制代码
vs2013完美通过了,结果错误的原因是:因为你的初始化矩阵里没有给定初值,所以在没赋值的情况下,这个初始化的矩阵里面的9个double的值都是随机的,
我给你的Matrix* InitMatrix(Matrix *matrix, int row, int line) 里改了,赋了初值,没问题了。
ps:dev-c++应该是自动赋值了0,而vs没有。
|
|