Как я могу выполнить эту матричную операцию?

#c

#c

Вопрос:

Операция # между матрицами может быть определена следующим образом:

Матрица A: размерность m x n, матрица B: размерность p x q, матрица A # B: размерность mp x nq.

введите описание изображения здесь

Это результат, который я получил.

 0
0
0
0
 

Мои коды.

 #include <stdio.h>
#include <conio.h>

int multiply(int s);

int row[2][2]={1,-3,-5,-7};
int row2[3][2]={0,2,4,6,8,0};

int main(void) {
    int result,i,j;
    for(i=0;i<2;i  ){
        for(j=0;j<2;j  ){       
            result=multiply(row[i][j]);
            printf("%dn",result);
        }
    }
    

    return 0;
}
    
int multiply(int number){
    int result,i,j;
    
    for(i=0;i<3;i  ){
        for(j=0;j<2;j  ){       
            result=row2[i][j]*(number);
            return resu<
        }
    }
}
 

Комментарии:

1. В multiply , вы возвращаетесь безоговорочно из самого внутреннего цикла. Вероятно, это не то, что вы хотите. Кроме того, разве вам не нужна int result[6][4] метрикс где-нибудь?

2. Почему вы используете глобальные переменные?

3. Если мне удастся получить результаты от программы, я могу сделать то, что вы говорите. Теперь я получаю только 0 выходных данных из программы. @M Oehm

4. row2[0][0] есть 0 . Вы multiply ведете себя так, как если бы это было int multiply(int number){ return 0 * number; } так. Вы должны решить, хотите ли вы просто распечатать результирующие значения или использовать multiply для их хранения в большей матрице, а затем распечатать ее. В любом случае вам необходимо существенно изменить оба main и multiply .

5. Я хочу создать новую большую матрицу, но как мне это сделать, я до сих пор не понял. @Bob__

Ответ №1:

Исходный код, который вы опубликовали, имеет несколько проблем:

  1. функция multiply() не возвращает значение для всех путей.
  2. Вы преждевременно завершаете умножение в тот момент, когда завершаете первый проход внутреннего цикла, вместо того, чтобы ждать всех результатов.
  3. Вы не накапливаете «результат» в своих циклах
  4. Вы не инициализируете «число», прежде чем пытаться его использовать; и при этом не передаете «число» в качестве параметра в «multiple()».
  5. Согласно вашему последнему обновлению, вам даже не нужен int «результат»… вам нужна матрица : int[6][4] results .

Вместо этого рассмотрим что-то вроде этого:

 void multiply(int ma[2][2], int mb[3][2], int result[6][4]){
    int i, j, k;
    //
    for(i=0;i<...;i  ){
        ...
        for(j=0;j<...;j  ){       
            ...
            for(k=0;k<...;k  ){       
                ...
            }
        }
    }
}

int main (int argc, char *argv{}) {
    int row[2][2]={1,-3,-5,-7};
    int row2[3][2]={0,2,4,6,8,0};
    int results[6][4] = {
      {0,0,0,0},
      {0,0,0,0},
      {0,0,0,0},
      {0,0,0,0},
      {0,0,0,0},
      {0,0,0,0}
   };
    ...
    multiply(row, row2, results);
    ...
}
 

ПРИМЕЧАНИЕ: этот код не является «полным». Это вам предстоит выяснить. В немалой степени, путем ознакомления с вашим отладчиком (gdb? ) и пошагового выполнения кода.

Я просто пытаюсь указать вам правильное направление.

Надеюсь, это поможет… хотя бы немного.

Комментарии:

1. Разве этот код не дает мне ни одной распечатки? Я хочу, чтобы все результаты были такими, как в последней матрице. @paulsm4

2. Мы не собираемся писать ваш код за вас. Ваша функция вернула один результат, ваша переменная может содержать только одно значение, поэтому я попытался показать вам, что вы делали неправильно до сих пор. Если вы хотите получить результаты в матрице … тогда вам нужно объявить матрицу! Я обновил свой ответ. Пожалуйста, отправьте ответ, если у вас есть какие-либо вопросы. Пожалуйста, опубликуйте любые внесенные вами изменения в коде. И, ПОЖАЛУЙСТА , подтвердите, что вам удобно использовать отладчик по мере необходимости.