【问题标题】:Multiplying matrices using pointers使用指针将矩阵相乘
【发布时间】:2013-09-23 23:26:15
【问题描述】:

大家好,我正在尝试在 C++ 中练习学习指针。所以我试图将这些数组相乘,并在我的结果矩阵中得到所有的 0。如果有人能提示我看什么或就造成这种情况的原因提供一些建议,那就太棒了。

代码如下:

#include <stdio.h>
#include<conio.h>
#include <stdlib.h>
#include <iostream>

/* Routines called. */
int loadMatrixFromFile(char *filename, int *data);
void showMatrix(int *data, int len);
int makeIdent(int matrixB[5][5], int length);
int matrixA[5][5];
int matrixB[5][5];
int matrixC[5][5];
void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]);

int main(){
    int len, data[1000];
    len = loadMatrixFromFile("Numbers.txt", data);
    showMatrix(data, len);
    makeIdent(matrixB, len);
    multiplyMatrices(matrixA, matrixB, matrixC);
}

int makeIdent(int matrixB[5][5], int len){
    int i,j;
    int *ptr;
    ptr = &matrixB[5][5];
    printf("Matrix B is: \n");
    for(i=0;i<5;i++){
           for(j=0;j<5;j++){
                 if(i==j){
                         *ptr=1;
                         printf("%d ", *ptr);
                 }
                 else{
                     *ptr=0;
                     printf("%d ",*ptr);
                 }
           }
           printf("\n");
     }
    return *ptr;
     printf("\n");
}
int loadMatrixFromFile(char *filename, int *data){
    FILE *in;
    int len;
    int j;
    in = fopen(filename, "r");
    if (in == NULL) {
        printf("Could not find file: %s \n", filename);
    }
    else {
        printf("Reading numbers...\n");
        fscanf(in, "%d", &len);
        printf("reading %d numbers from file %s ....\n", len, filename);
        for(j=0;j<len;j++) {
            fscanf(in, "%d", data + j);
        }
        fclose(in);
    }
    for(int i = 0; i<5; i++){
        for(int j = 0; j < 5; j++){
                matrixA[i][j] = *(data + i*5 + j);
        }
    }
    return len;
}
void showMatrix(int *data, int len){
    int j;
    int count = 0;
    printf("Showing %d numbers from data array....\n", len);
    printf("Matrix A is: \n");
    for(j=0;j<len;j++) {
        printf("%d ", *(data + j));
        count++;
        if(count % 5 == 0){
            printf("\n");
        }
    }
    printf("\n");
}

void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]){

     int i, n, j;
     int *ptr1, *ptr2, *ptr3;
     ptr1 = &matrixA[5][5];
     ptr2 = &matrixB[5][5];
     ptr3 = &matrixC[5][5];

     printf("\n");
     printf("Matrix A x Matrix B is: \n");
     for(i=0;i<5;i++){
         for(j=0;j<5;j++){
             *ptr3=0;
         }
     }
     for (i = 0; i<5; i++){
            for (j = 0; j<5; j++){
                for(n=0;n<5;n++){
                *ptr3 += (*ptr1**ptr2);
      }
                printf("%d ",*ptr3);
    }
    printf("\n");
  }
}

【问题讨论】:

  • 在 multiplyMatrices *ptr3=0;在一个循环中受到很多打击。似乎毫无意义。
  • 在 multiplyMatrices ptr[1-3] 都指向矩阵的末尾!哎呀。
  • 哦,你永远不会在 multiplyMatrices 中增加指针。
  • 你是什么意思他们都指向矩阵的末尾?我在 multiplyMatrices 中进行了第一个循环,将 matricC 设为全 0。另外我该如何增加所有 3 个指针?
  • multiplyMatrices 中的第一个循环没有初始化 C。此外,您不需要初始化 C。C = A * B。试试我下面的代码,看看会发生什么。

标签: c++ c arrays pointers matrix-multiplication


【解决方案1】:

makeIdent 中,您需要在每个元素之后增加ptr。到 初始化ptr 你需要将它指向数组中的第一个元素,而不是最后一个元素。

int makeIdent(int matrixB[5][5], int len){
    int i,j;
    int *ptr;
    ptr = &matrixB[0][0]; // note the 0 instead of the 5
    printf("Matrix B is: \n");
    for(i=0;i<5;i++){
           for(j=0;j<5;j++){
                 if(i==j){
                         *ptr=1; 
                         printf("%d ", *ptr);

                 }
                 else{
                     *ptr=0;
                     printf("%d ",*ptr);
                 }
                 ptr++; // this is new
           }
           printf("\n");
     }
    return 0;
}

这更接近您想要的 multiplyMatrices:

void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]){

 int i, n, j;
 int *ptr1, *ptr2, *ptr3;
 ptr1 = &matrixA[0][0];
 ptr2 = &matrixB[0][0];
 ptr3 = &matrixC[0][0];

 for (i = 0; i<5; i++) {
     for (j = 0; j<5; j++) {
         *ptr3 = (*ptr1 * *ptr2);
         ptr1++; ptr2++; ptr3++;
     }
 }
}

你可以这样说:

*ptr3++ = *ptr1++ * *ptr2++;

但我不想混淆这个问题。

【讨论】:

  • 嗯,我试过那个。它给了我一个全为 0 的 5x5 矩阵,除了 [0][3] 表示 15746200。那是它为该索引引用的地址吗?
  • 您的代码中还有其他问题。例如,makeIdent 不起作用。
  • 不,您认为它有效是因为您的打印语句。您的打印语句不反映数组中存储的内容。您需要在数组中移动那个“ptr”,而不仅仅是指向一个静态位置。
  • 我建议研究数组的布局方式以及如何将指针从数组的开头移动到数组的结尾。在您的所有代码中,您永远不会增加任何指针。指针不会在你的 i 和 j 循环中自动递增。
  • 好的,希望对您有所帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2015-01-24
  • 2016-12-11
相关资源
最近更新 更多