song.yz@foxmail.com wechat: math-box

计算数学



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;
}



或者定义为结构体形式,这样在矩阵与向量运算时,维数可以包含在结构体的元素中,而不必作为参数输入输出。 使用变长数组的好处是不需要显式的动态分配内存并释放内存。但是在函数中使用时,需要用于声明变量长度的变量在数组之前。