Проблема с использованием указателей для умножения матриц - PullRequest
0 голосов
/ 18 мая 2019

Я пытался заставить этот код для умножения многомерных матриц работать без особого успеха в течение пары недель.

Код работает для любого данного умножения между матрицами одинаковых измерений, однако когдаЯ запускаю что-то вроде 2x3 * 3x4, он сохраняет только около половины значений в результирующей матрице, я прошел много итераций программ, включая полное переписывание с нуля или работу с предыдущей программой, которая делала бы то же самое, но без обозначения указателя иза работой.Это для назначения, поэтому у меня есть ограничения использования нотации указателя и не использования динамической памяти.Я не уверен, что мне здесь не хватает даже после просмотра документации и примеров.ребята, можете ли вы дать мне несколько советов о том, что происходит здесь?

#include<stdio.h>

int main(){

int i, j, k, l, n1=1, n2=1, n3=1, n4=1, m1;

int p1[11][11], p2[11][11], p3[11][11];

 printf("\n\nInput first matrix number of rows and columns : \n");
 scanf("%d %d", &n1, &n2);
 printf("\n\nInput second matrix number of rows and columns : \n");
 scanf("%d %d", &n3, &n4);


printf("\n\nInput your values for the first matrix: \n");
for(i=0; i<n1; i++){
    for(j=0; j<n2; j++){
    printf("\n Input element of Row [%d] and Colunm[%d] = ", i+1, j+1);
    scanf("%d", (*(p1+i)+j));
    }
}

printf("\n\nInput your values for the second matrix : \n");
for(i=0; i<n3; i++){
    for(j=0; j<n4; j++){
    printf("\n Input element of Row [%d] and Colunm[%d] = ", i+1, j+1);
    scanf("%d", (*(p2+i)+j));
   }
}
printf("\n\n\n");
for(i=0;i<n1;i++){
     for(j=0;j<n4;j++){
     m1=0;
          for(k=0;k<n3;k++){
          m1+=(*(*(p1 + i) + k)) * (*(*(p2 + k) + j));
          }
     *(*(p3+j)+i)=m1;
      printf("[%d][%d][%d][%d] ", *(*(p1+i)+j), *(*(p2+i)+j), *(*(p3+i)+j), m1);
  }
}

printf("\n\n");
printf("\n\nThe result is: \n\n\n\t");
 for(i=0; i<n1; i++){
    printf("\n\t");
    for(j=0; j<n4; j++){
  printf("[%d]\t", *(*(p3+i)+j));
  }
  printf("\t\n\n\n\t");
}
printf("\n");

system("pause");
}

Я не получаю сообщения об ошибках, но для данного умножения матрицы разных измерений 2x3 * 3x4 результат будет:

12 12 0 0
12 12 9 2508544

или аналогичным, в то время как ожидаемый результат:

12 12 12 12
12 12 12 12

То же самое относится к любым матрицам, которые имеют разные размеры, но квадратные матрицы получаются в порядке.

1 Ответ

1 голос
/ 18 мая 2019

В вашем цикле вычислений вы обращаетесь к *(*(p3 + j) + i), сначала используя внутреннюю переменную цикла.

В своем цикле печати вы используете *(*(p3 + i) + j), сначала используя внешнюю переменную цикла.

Таким образом, ваш цикл печати печатает на транспонированной матрице результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...