使用指针将 2 个矩阵相乘

Multiplying 2 matrices using pointers

本文关键字:指针      更新时间:2023-10-16

所以我试图弄清楚如何使用指针将 2 个矩阵相乘。 它成功地以现在的方式工作,但我想学习指针的使用,而不是使用传统的数组访问方法。

这是我的代码:

#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;
    printf("Matrix B is: n");
    for(i=0;i<5;i++){
           for(j=0;j<5;j++){
                 if(i==j){
                         matrixB[i][j]=1;
                         printf("%d ",matrixB[i][j]);
                 }
                 else{
                     matrixB[i][j]=0;
                     printf("%d ",matrixB[i][j]);
                 }
           }
           printf("n");
     }
    return matrixB[i][j];
     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 count = 0;
     printf("n");
     printf("Matrix A x Matrix B is: n");
     for (i = 0; i<5; i++){
            for (j = 0; j<5; j++){
                matrixC[i][j] = 0;
                matrixC[i][j] += matrixA[i][j]*matrixB[i][j];
                printf("%d ",matrixC[i][j]);
                count++;
                if(count % 5 == 0){
                printf("n");
      }
    }
  }
}
好吧,

你的矩阵乘法算法是完全错误的。

说"我想学习如何用指针来做",但事情是这样的,你已经在用指针来做这件事了。

在此代码中

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

变量 matrixAmatrixBmatrixC 是指针。在C++不可能有一个函数参数的数组。它会自动转换为指针。访问数组的语法与访问指针的语法相同,这也是事实。

如果你想明确表示你正在使用指针,那么像这样重写你的代码

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

现在你可以看到matrixAmatrixBmatrixC指向 5 个整数数组的指针。您不必进行任何其他更改。事实上,当您尝试将数组用作函数参数时,编译器所做的正是此更改。

这是一个好看的链接,解释了指针和数组的比较方式。该链接谈论 C,但规则在C++中是相同的。阅读它可能会帮助你比我更好地理解。