试图编写矩阵乘法实验的脚本

时间:2018-02-01 23:46:47

标签: c matrix scripting

所以我的任务是编写一个程序,它将50到3000之间的随机矩阵相乘,我遇到了麻烦。我不确定在脚本运行时更改大小的最佳方法。我可以手动完成,但这需要几个小时坐在电脑前,我觉得有一种简单的方法,我错过了。我知道如果我在main中定义这些矩阵,超过800的任何东西都会导致众所周知的堆栈溢出,这就是我将它们放在main之外的原因。不幸的是,现在我不能简单地将N作为argv [1]。我的问题是:是否有可能按照以下方式编写脚本:

./matrix 50  
./matrix 150  
./matrix 200  

等等 如果是的话,怎么样?

#include <foo>
#define N 1000


int A[N][N];
int B[N][N];
int result[N][N];

int main(int argc, char *argv[]){
//so on

提前感谢所有回复的人。

1 个答案:

答案 0 :(得分:0)

如果维度n作为参数传递给程序,则 malloc / calloc是个不错的选择。我会做这样的事情:

int **matrix_create(size_t dim)
{
    int **matrix = calloc(dim, sizeof *matrix);

    if(matrix == NULL)
        return NULL;

    for(size_t i = 0; i < dim; ++i)
    {
        matrix[i] = calloc(dim, sizeof *matrix[i]);
        if(matrix[i] == NULL)
        {
            matrix_free(matrix, dim);
            return NULL;
        }
    }

    return matrix;
}

void matrix_free(int **matrix, size_t dim)
{
    if(matrix == NULL)
        return;

    for(size_t i = 0; i < dim; ++i)
        free(matrix[i]);

    free(matrix);
}

然后你可以像main那样创建矩阵:

int main(int argc, char **argv)
{
    if(argc < 2)
    {
        fprintf(stderr, "usage: %s dim\n", argv[0]);
        return 1;
    }

    // just an example of how to convert,
    // you could also use strtol
    size_t dim = atoi(argv[i]);

    int **matrix_a = matrix_create(dim);
    if(matrix_a == NULL)
        return 1;

    int **matrix_b = matrix_create(dim);
    if(matrix_b == NULL)
    {
        matrix_free(matrix_a);
        return 1;
    }

    do_something_with(matrix_a, matrix_b, dim);


    matrix_free(matrix_a);
    matrix_free(matrix_b);

    return 0;
}

请注意,我使用的是calloc而非malloc,因为calloc具有优势 将0设置为已分配的内存。它非常适合初始化和错误 处理,因为允许free(NULL),所以在分配内存时会看到 对于matrix[i]行,如果出现问题,我可以放心使用 matrix_free整个矩阵。