2013-09-17 3 views
2

, поэтому у меня возникает проблема умножения двух массивов 2d вместе. Я уверен, что matrixA и matrixB хранятся правильно, они отображаются правильно, когда программа запущена. Когда я пытаюсь умножить 2 массива вместе, я получаю длинную строку из множества 1 и 0. Любая идея о том, что может быть проблемой?Умножение двух 2D-массивов

Вот мой код:

#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]); 
     } 
    } 
    } 
} 

Вот как выглядит текст файла, что массив А тянет от:

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 
+0

С симулированным входом, кажется, работает хорошо для меня. [проверьте это] (http://coliru.stacked-crooked.com/a/a330bff6138045cd) – Chemistpp

+0

Thats weird. В консольной шахте показаны: Matrix A x Matrix 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 ....... – Shawn

+2

Я думаю, вам нужно инициализировать 'matrixC' нулями перед началом умножения. Кроме того, не печатайте в цикле умножения, если только для его отладки. Распечатайте его с помощью 'showMatrix()', как и для других. – Rohan

ответ

2

Кажется что-то здесь:

matrixA[i][j] = *data;

Вы должны использовать

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

Кроме того, попытайтесь печать:

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

внутри второго цикла n (после внутреннего цикла j).

+0

Это помогло немного 0xF1 :). Выход, который я получаю сейчас, это Matrix A x Matrix B = (следующая строка) 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 0 0 6 7 8 0 0 6 7 8 9 0 6 7 8 9 1 2 0 0 0 0 2 3 0 0 ....... Похоже, что есть какая-то модель, в которой по какой-то причине числа подвергаются лечению. – Shawn

+1

@Shawn: См. Мой отредактированный ответ. –

+0

Таким образом, он работает, но не очень LOL. Я получил его, чтобы показать массив, разбивающий строку после каждых 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 ..... Оно умножает каждое число в матрице А на единичную матрицу и затем отображает все из них вместо того, чтобы просто заменить 1 в единичной матрице (матрица B) на значение в матрице А. – Shawn

Смежные вопросы