【问题标题】:Error in multiplying matrix vector - invalid operands to binary * (have 'double *' and 'double *')将矩阵向量相乘时出错 - 二进制 * 的操作数无效(有 'double *' 和 'double *')
【发布时间】:2019-04-18 20:10:46
【问题描述】:

我正在尝试使用指针将一个大的随机矩阵 (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][j] = ptr3[i] + ptr1[i] * ptr2[k]; 中,ptr3[i][j]double 值,但其他三个是指针,加/乘它们没有意义。
  • 还要注意,您将ptr2 设为像ptr1ptr3 这样的二维数组,而不是叙述中提到并在循环中初始化的一维数组。
  • 贴出来的代码好像被修改了,没有评论。
  • 这看起来像是一个“流沙”问题。请复制/粘贴您的实际代码并保留,以便 cmets 和答案保持相关性。

标签: c matrix vector multiplication


【解决方案1】:

编译器的意思是,在语句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)可能会让您有点头疼。

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2018-10-25
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多