2015-03-27 3 views
-1
void power(int a[][21], int n, int d) { 
    int e[21][21], k, i, j, l; 

    if (d == 1) { 
     for (i = 1; i <= n; i++) { 
      for (j = 1; j <= n; j++) 
       cout << a[i][j] << " "; 

      cout << endl; 
     }  
    } else { 
     for (i = 1; i <= n; i++) 
      for (j = 1; j <= n; j++) 
       e[i][j] = 0; 

     for (l = 1; l < d; l++) 
      for (i = 1; i <= n; i++) 
       for (j = 1; j <= n; j++) 
        for (k = 1; k <= n; k++) 
         e[i][j] = e[i][j] + (a[i][k] * a[k][j]); 

     for (i = 1; i <= n; i++) { 
      for (j = 1; j <= n; j++) 
       cout << e[i][j] << " "; 

      cout << endl; 
     } 
    } 
} 

Я пытаюсь построить функцию, которая вычисляет мощность матрицы. Программа работает для 1-го и 2-го уровней матрицы, но если я хочу рассчитать 3-ю степень, функция вернет неправильные значения. Я думаю, проблема заключается в сохранении предыдущих результатов, но я не могу понять, как это исправить.Матричное умножение - C++

+5

_ "но я не могу понять, как это исправить" _ Легко. Вы используете отладчик, переходите через свой код по строкам и проверяете, как изменяются значения. Если вы обнаружили место, где значения меняются неожиданным образом, вы поймали источник своей логической ошибки. Разве это не чудесно? –

+2

Почему вы перебираете индекс 1 в каждом цикле? – LogicStuff

+0

Для полномочий после 2 вы по-прежнему используете только значения из 'a', а не также включаете результаты из' e'. Следуйте советам @ πάνταῥεῖ по отладке; это требует, чтобы вы знали, как ожидается изменение значений, поэтому вы должны начать с разработки (на бумаге), как вы ожидаете, что вычисление будет продолжено. Скорее всего, это упражнение покажет, как ваш код не использует предыдущие результаты (как вы говорите). –

ответ

2

Этот блок кода

for (l = 1; l < d; l++) 
     for (i = 1; i <= n; i++) 
      for (j = 1; j <= n; j++) 
       for (k = 1; k <= n; k++) 
        e[i][j] = e[i][j] + (a[i][k] * a[k][j]); 

наборы e не быть a*a независимо от того, что d есть.

Для того чтобы все работало, необходимо иметь временную матрицу.

Bootstrap:

e = a; 

В цикле:

temp = e; 
e = temp * a; 

temp = e; 
e = temp * a; 

... и т.д.

Что-то вдоль линий:

for (i = 0; i < n; i++) 
{ 
    for (j = 0; j < n; j++) 
    { 
     e[i][j] = a[i][j]; 
    } 
} 


for (l = 1; l < d; l++) 
{ 
    for (i = 0; i < n; i++) 
    { 
     for (j = 0; j < n; j++) 
     { 
     temp[i][j] = e[i][j]; 
     } 
    } 

    for (i = 0; i < n; i++) 
    { 
     for (j = 0; j < n; j++) 
     { 
     e[i][j] = 0; 
     for (k = 0; k < n; k++) 
     { 
      e[i][j] += (temp[i][k] * a[k][j]); 
     } 
     } 
    } 
} 

PS Я использовал индексирование 0 для доступа к матрицам. Я не уверен, почему вы использовали индексацию 1.

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