#c
#c
Вопрос:
Пытаюсь сделать матричный множитель 3 x 3, но он выдает неверный вывод. Я не знаю, что я делаю не так. Две проблемы, с которыми я сталкиваюсь:
(1) Некоторые переменные хранят неправильные входные данные. Например a[1][1]
, показывает 7, хотя я ввел 1
(2) Умножение матрицы неверно
#include <stdio.h>
#include <conio.h>
void matrix_format(int m[2][2])
{
int i,j;
printf("nn");
for(i=0;i<=2;i )
{
for(j=0;j<=2;j )
{
if(j==0)
printf("[ %d |",m[i][j]);
else if(j==1)
printf(" %d |",m[i][j]);
else if(j==2)
printf(" %d ] n",m[i][j]);
}
}
}
int main(void)
{
void matrix_format(int [2][2]);
int a[2][2], b[2][2], r[2][2],m,i,j;
clrscr();
for(m=1;m<=2;m )
{
if(m==1)
{
printf("Enter values for the matrix A n");
}
else
{
printf("nnEnter values for the matrix B n");
}
for(i=0;i<=2;i )
{
for(j=0;j<=2;j )
{
if(m==1)
{
printf("A[%d][%d] : ",i 1,j 1);
scanf("%d",amp;a[i][j]);
}
else if(m==2)
{
printf("B[%d][%d] : ",i 1,j 1);
scanf("%d",amp;b[i][j]);
}
}
}
}
printf("n Matrix A : n");
matrix_format(a);
printf("n Matrix B : n");
matrix_format(b);
for(i=0;i<=2;i )
{
for(j=0;j<=2;j )
{
r[i][j]= a[i][j] * b[j][i];
}
}
printf("n Matrix Multiplication Result : n");
matrix_format(r);
getch();
return 0;
}
вывод:
Пожалуйста, направьте меня.
Комментарии:
1. Вы делаете компонентное умножение, а не то, что я обычно называю матричным умножением, это специально?
Ответ №1:
Первая проблема, которая возникает, заключается в том, что все ваши массивы имеют размер 2×2, в то время как они должны быть 3×3:
m[2][2]
следует прочитать
m[3][3]
и так далее. Число в скобках — это размер массива, а не индекс последнего элемента.
Это объяснит некоторые странности, в частности, почему некоторые элементы таинственным образом перезаписываются.
Что касается фактического умножения матрицы, ваш алгоритм не совсем правильный (предполагая, что то, что вы пытаетесь реализовать, является стандартным матричным продуктом линейной алгебры). Подумайте о том, какие шаги требуются для умножения двух матриц и что на самом деле делает ваш код. Поскольку это домашнее задание, я дам вам только подсказку:
Произведение матрицы включает в себя суммирование произведений элементов.
Комментарии:
1. Но все массивы начинаются с 0 в C
2. @Failed_Noob: Правильно. Однако при объявлении массивов число в скобках представляет желаемый размер массива, а не индекс в массиве.
3. Да, но при их объявлении вы должны указать их фактический размер, начиная с 1. При обращении к ним, тогда да, они начинаются с 0.
Ответ №2:
Есть две основные проблемы:
Во-первых, матрица 3 * 3 представлена int matrix[3][3]
символом not int matrix[2][2]
. Причина, по которой вы видите странные результаты, заключается в том, что вы пишете поверх границ массива, эффективно записывая поверх другой матрицы, потому что их ячейки памяти смежны.
Примечание: массив, такой как int a[10]
, может быть проиндексирован только от 0
до 9
.
Еще одна проблема — это ваше умножение. Из математики мы знаем, что если у нас есть:
C = A x B
Тогда мы имеем:
C[i][j] = sum(A[i][k]*A[k][j]) over k
Это в вашем случае:
C[i][j] = A[i][0]*A[0][j] A[i][1]*A[1][j] A[i][2]*A[2][j]
Итак, вы должны иметь:
for over i
for over j
C[i][j] = 0
for over k
C[i][j] = A[i][k]*B[k][j]
Ответ №3:
Я написал простую программу умножения матрицы без использования указателей. Надеюсь, это сработает для вас. Я вижу, что вы знаете, как использовать функции, поэтому старайтесь использовать их чаще. Также ваша логика умножения была неправильной. Прочитайте об этом, а затем посмотрите код. (Если вы хотите выполнить умножение матрицы, скажем, для матрицы 5 x 5, тогда вам следует просто перейти #define SIZE 3
на #define SIZE 5
).
#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
void CreateMatrix(char name, int m[SIZE][SIZE]) {
int row, col;
printf("Enter values for the matrix %c:n", name);
for(row = 0; row < SIZE; row ) {
for(col = 0; col < SIZE; col ) {
printf("%c[%d][%d] : ", name, row 1, col 1);
scanf("%d", amp;m[row][col]);
}
}
printf("n");
}
void PrintMatrix(char name, int m[SIZE][SIZE]) {
int row, col;
printf("Matrix %c:n", name);
for (row = 0; row < SIZE; row ) {
printf("[ ");
for (col = 0; col < SIZE; col ) {
printf("%d ", m[row][col]);
}
printf("]n");
}
printf("n");
}
void MatrixMultiply(int a[SIZE][SIZE], int b[SIZE][SIZE], int mul[SIZE][SIZE]) {
int row, col, k;
for (row = 0; row < SIZE; row ) {
for (col = 0; col < SIZE; col ) {
mul[row][col] = 0;
for (k = 0; k < SIZE; k ) {
mul[row][col] = a[row][k] * b[k][col];
}
}
}
}
int main() {
int a[SIZE][SIZE];
int b[SIZE][SIZE];
int mul[SIZE][SIZE];
// Create Matrices
CreateMatrix('A', a);
CreateMatrix('B', b);
// Matrix Multiplication
MatrixMultiply(a, b, mul);
// Print Matrices
PrintMatrix('A', a);
PrintMatrix('B', b);
PrintMatrix('M', mul);
}
Вывод:
Enter values for the matrix A:
A[1][1] : 1
A[1][2] : 2
A[1][3] : 3
A[2][1] : 4
A[2][2] : 5
A[2][3] : 6
A[3][1] : 7
A[3][2] : 8
A[3][3] : 9
Enter values for the matrix B:
B[1][1] : 1
B[1][2] : 2
B[1][3] : 3
B[2][1] : 4
B[2][2] : 5
B[2][3] : 6
B[3][1] : 7
B[3][2] : 8
B[3][3] : 9
Matrix A:
[ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ]
Matrix B:
[ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ]
Matrix M:
[ 30 36 42 ]
[ 66 81 96 ]
[ 102 126 150 ]
Ответ №4:
Во-первых, см. Ответ @aix относительно размеров массива. Тогда причина, по которой умножение не работает, заключается в том, что вы используете неправильную формулу. Элемент в i, j в результирующей матрице не является просто произведением i, j и j, i из двух умножаемых матриц — вместо этого каждый элемент в строке i из левой матрицы должен быть умножен на соответствующий элемент из столбца j из правой матрицы, и все произведениядолжны быть добавлены вместе. Смотрите эту иллюстрацию в статье Википедии.
Ответ №5:
у вас есть определенный массив размером 2 * 2, т.Е. Он имеет индекс 0,1. но в вашем цикле FOR вы пытаетесь принять 3, т.е. {0,1,2 } элементов в одной строке. поэтому удалите знак = из всех циклов FOR . или просто измените объявление вашего массива на [3] [3] .Также затем примените правильную формулу для умножения матрицы, т.е. r [0] [0] =(a[0] [0] *b[0] [0]) (a [0] [1] * b[1] [0]) (a [0][2]*b[2][0]). для первой ячейки и так далее для других ячеек, в вашем случае для матрицы 3 * 3.