【问题标题】:Multiplying two 2D arrays将两个二维数组相乘
【发布时间】:2013-09-21 08:41:21
【问题描述】:

所以我在将两个二维数组相乘时遇到问题。我很确定 matrixA 和 matrixB 被正确存储,它们在程序运行时正确显示。当我尝试将 2 个数组相乘时,我得到一个包含很多 1 和 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;
    printf("Matrix B = \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;
        }
    }
    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 = \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;

         printf("\n");
 printf("Matrix A x Matrix B = \n");
 for (i = 0; i<5; i++){
    for (n = 0; n<5; n++){
        for (j = 0; j<5; j++){
            matrixC[i][n] += matrixA[i][j]*matrixB[j][n];
            printf("%d ",matrixC[i][n]);
      }
    }
  }
}

这是从文本文件中提取数组 A 的样子:

25 

1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2
3 4 5 6 7

【问题讨论】:

  • 使用模拟输入,对我来说似乎工作正常。 check this
  • 这很奇怪。在控制台中显示:矩阵 A x 矩阵 B = 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1.......
  • 我认为您需要在开始乘法之前将matrixC 初始化为零。另外,不要在乘法循环中打印,除非它用于调试。使用showMatrix() 打印它,就像为其他人所做的那样。
  • 这里似乎有问题:matrixA[i][j] = *data;
  • 看来您正在编写 C 代码,而不是 C++ 代码,因为您包含 &lt;stdio.h&gt; 而不是 &lt;cstdio&gt;。如果您确实在编写 C 代码,则应该包含&lt;iostream&gt;

标签: c arrays matrix-multiplication


【解决方案1】:

这里似乎有问题:

matrixA[i][j] = *data;

你应该使用

matrixA[i][j] = *(data + i*5 + j);

另外,尝试打印:

printf("%d ",matrixC[i][n]);

在第二个循环n 内(在最内循环j 之后)。

【讨论】:

  • 这对 0xF1 有点帮助 :)。我现在得到的输出是 Matrix A x Matrix B = (next line) 1 0 0 0 0 1 2 0 0 0 1 2 3 0 0 1 2 3 4 0 1 2 3 4 5 6 0 0 0 0 6 7 0
  • 所以它有点工作,但不是真的哈哈。我让它显示数组在每 5 个数字后换行。所以它打印出 1 0 0 0 0 (\n) 0 2 0 0 0 (\n) 0 0 3 0 0 (\n) 0 0 0 4 0 (\n) 0 0 0 0 5 (\n) 6 0 0 0 0 (\n) 0 7 0 0 0 .....它将matrixA中的每个数字乘以单位矩阵,然后显示所有这些,而不是仅仅将单位矩阵(matrixB)中的1替换为矩阵A中的值。
  • 好吧,你确定你的算术是正确的吗?因为增量意味着您将身份的对角线与 A 的行相乘。您的预期输出是什么?
  • @Chemistpp 我的算术必须关闭,因为我并不意味着它每次在 i 中递增时都创建一个新行。我正在寻找每个矩阵中的更多索引以仅在另一个矩阵上相乘。现在正在努力。
  • @Shawn 删除乘法中的嵌套循环之一,并将行更改为matrixC[i][j] = matrixA[i][j]*matrixB[i][j];
猜你喜欢
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多