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

标签 c matrix vector multiplication

我正在尝试使用指针将一个大的随机矩阵 (NxN) 和一个随机 vector (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] 指定为 null pointer ,与 C 中的 0 相同(其他语言对此值有不同的名称:nullNone 等)。我认为你在这里要做的是:

*ptr3[i] = 0;
<小时/>

顺便说一句,由于 N 是已知的固定值,因此您可以选择不处理所有 malloc 内容,只需说:

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

这将 ptr1 声明为数组而不是指针,这在内存访问模式方面与指针相同,但是 different in a number of ways 。根据您想要学习的内容,不处理动态内存(使用 mallocfree)可能会暂时让您避免一些头痛。

关于c - 矩阵 vector 相乘时出错 - 二进制 * 的操作数无效(有 'double *' 和 'double *' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753113/

相关文章:

Opencv 乘以标量和矩阵

c++ vector of pairs of pointers 搞砸了

c - 理解这个 opengl 代码

c - 这段代码定义是否明确(Casting HANDLE)

在 OS X 上编译 Lex 程序

r - 将列表的多个元素转换为矩阵 R

c++ - OpenGL 在应该围绕本地原点时围绕世界原点旋转

c++ - 为什么这里不允许将一个 vector 附加到另一个 vector ?

c - 为什么将值写入数组时会出现错误?

在 Linux 上将 CUDA 代码编译为静态库 (.a)