矩阵向量相乘时出错-无效的操作数为二进制*(具有'double *'和'double *')

时间:2019-04-18 20:10:46

标签: c matrix vector multiplication

我正在尝试使用指针将大型随机矩阵(NxN)和随机向量(N)相乘。  为什么我收到错误类型“对二进制*无效的操作数((具有'double *'和'double *'))? 错误似乎在ptr3 [i] [j] = ptr3 [i] + ptr1 [i] * ptr2 [k]中; 但我不知道为什么这行不通。 我是C语言的新手,所以我仍然不太了解指针。

int main ()
{
    time_t t;
    double **ptr1, **ptr2, **ptr3;
    int i, j, k;
    int N = 500;
    ptr1 = (double **) malloc (sizeof (double *) * N);
    ptr2 = (double **) malloc (sizeof (double *) * N);
    ptr3 = (double **) malloc (sizeof (double *) * N);

    for (i = 0; i < N; i++)
        ptr1[i] = (double *) malloc (sizeof (double) * N);
    for (i = 0; i < N; i++)
        ptr2[i] = (double *) malloc (sizeof (double) * N);
    for (i = 0; i < N; i++)
        ptr3[i] = (double *) malloc (sizeof (double) * N);

    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            ptr1[i][j] = rand ();
        }
    }
for (i = 0; i < N; i++) {
            *ptr2[i] = rand ();
    }
    t = clock();

    for (i = 0; i < N; i++) {

            ptr3[i] = 0;
            for (k = 0; k < N; k++)
                ptr3[i] = ptr3[i] + ptr1[i][k] * ptr2[k];

    }

   t = clock() - t;
    double time_taken = ((double)t)/CLOCKS_PER_SEC;
    printf("Tempo:  %f segundos \n", time_taken);

 printf ("\n");
    return (0);
} ```

1 个答案:

答案 0 :(得分:0)

编译器的意思是,在语句ptr3[i] = ptr3[i] + ptr1[i] * ptr2[k];中,表示ptr1[i] * ptr2[k]的位试图在类型为*的两个表达式之间进行double*。换句话说,不允许将两个指针相乘。要正确执行此操作,您需要再次取消引用([i][k]已将double**取消引用为double*)。为了使它能够被编译,该语句应该是(为了清楚起见,我添加了括号-实际上并不需要它们):

*ptr3[i] = (*ptr3[i]) + (*ptr1[i]) * (*ptr2[k]);

应该可以进行编译,但是遇到的下一个问题是分段错误。在进行乘法的地方上方两行显示:

ptr3[i] = 0;

这是将ptr3[i]分配为null pointer,与C语言中的0相同(其他语言的值与此不同:null,{ {1}},等等。我想您打算在这里做的是:

None

顺便说一句,由于*ptr3[i] = 0; 是一个已知的固定值,因此您可以选择不处理所有N的内容,只需说一声:

malloc

这是将const int N = 500; double ptr1[N][N]; double ptr2[N][N]; // ... and so on ... 声明为 array 而不是指针,就内存访问模式而言,该指针与指针相同,但是different in a number of ways。根据您要学习的内容,不处理动态内存(使用ptr1malloc)可能会为您节省一些头痛。