计算数学
C99变长数组
在C99中还支持变长数组运算。下面给出范例
#include
void matrix_vector_multiply(int m, int n, double A[m][n], double v[n], double w[m])
{
for (int i = 0; i < m; ++i)
{
w[i] = 0.0;
for (int j = 0; j < n; ++j)
{
w[i] += A[i][j] * v[j];
}
}
}
// 定义矩阵乘法函数
void matrix_multiply(int m, int p, int n, double A[m][p], double B[p][n], double C[m][n])
{
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
C[i][j] = 0.0;
for (int k = 0; k < p; ++k)
{
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
void testMatrixMulVector()
{
int m = 3, n = 4; // 矩阵的行数和列数
double A[m][n]; // 不在这里初始化,稍后手动赋值
double v[n]; // 同样不在此处初始化,稍后手动赋值
// 初始化矩阵A和向量v
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
A[i][j] = (i+1) + (j+1)*10; // 这里只是举个例子,可以替换为你需要的数据
}
}
for (int j = 0; j < n; ++j)
{
v[j] = (j+1) * 10; // 同样,这里只是举例,可以替换为你需要的数据
}
double w[m];
matrix_vector_multiply(m, n, A, v, w);
// 输出结果向量
for (int i = 0; i < m; ++i)
{
printf("w[%d] = %.2f\n", i, w[i]);
}
}
void testMatrixMulMatrix()
{
int m = 2, p = 3, n = 4; // 矩阵A的行数、矩阵A和B的公共列数、矩阵B的列数
double A[m][p];
double B[p][n];
// 初始化矩阵A和B
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < p; ++j)
{
A[i][j] = (i+1) + (j+1)*10; // 这里只是举个例子,可以替换为你需要的数据
}
}
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < n; ++j)
{
B[i][j] = (i+1) + (j+1)*100; // 这里只是举个例子,可以替换为你需要的数据
}
}
double C[m][n]; // 结果矩阵
matrix_multiply(m, p, n, A, B, C);
printf("A= \n" );
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < p; ++j)
{
printf("%.2f ", A[i][j]);
}
printf("\n");
}
printf("B= \n" );
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < n; ++j)
{
printf("%.2f ", B[i][j]);
}
printf("\n");
}
// 输出结果矩阵
printf("C= \n" );
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
printf("%.2f ", C[i][j]);
}
printf("\n");
}
}
int main()
{
testMatrixMulVector();
testMatrixMulMatrix();
return 0;
}
或者定义为结构体形式,这样在矩阵与向量运算时,维数可以包含在结构体的元素中,而不必作为参数输入输出。 使用变长数组的好处是不需要显式的动态分配内存并释放内存。但是在函数中使用时,需要用于声明变量长度的变量在数组之前。