簡體   English   中英

將矩陣向量相乘時出錯 - 二進制 * 的無效操作數(具有“雙 *”和“雙 *”)

[英]Error in multiplying matrix vector - invalid operands to binary * (have 'double *' and 'double *')

我正在嘗試使用指針將一個大的隨機矩陣 (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);
} ```

編譯器所說的是在語句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]分配為空指針,它與 C 中的0相同(其他語言對此值有不同的名稱: nullNone等)。 我認為你在這里要做的是:

*ptr3[i] = 0;

順便說一句,由於N是一個已知的固定值,您可以選擇不處理所有malloc內容,只需說:

const int N = 500;
double ptr1[N][N];
double ptr2[N][N];
// ... and so on ...

這將ptr1聲明為數組而不是指針,它在內存訪問模式方面與指針相同,但在許多方面有所不同 根據您嘗試學習的內容,不處理動態內存(使用mallocfree )可能會讓您暫時省去一些麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM