Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Умножения матриц 
V
    Опции темы
bobik02
  Дата 4.12.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 3
Всего: 14



Здрастуйте вот, задали такую задачу:
 Дано две квадратические матрицы A и D, (n = 3) . Вычислить Матрицу: 
C = A * B + D * A
, где элементы матрицы B делаются за формулою , (формулу приложил во вложении )
Умножения матрицы на матрицу сделать у виде подпрограммы. 


вот что на данный момент удалось написать:
Код

#include <iostream>
#include <conio>
#include <iomanip>

using namespace std;

const int n = 3;

// тут надо написать функцию умножение квадратических матриц ...

int main(int argc, char* argv[])
{
  clrscr();
  randomize();

  double  arrayA[n][n];
  double  arrayB[n][n];
  double  arrayC[n][n];
  double  arrayD[n][n];

  // заполняем єлементы матриц A и D
  for (int i=0; i < n; i++)
  {
     for (int j=0; j < n; j++)
     {
       arrayA[i][j] = random(30) ;
       arrayD[i][j] = random(50) ;
     }
  }

  // заполняем элементы матрицы B
 for (int i = 0; i < n; i++)
 {
   /*
   В данном случае главную диагональ заполняем нулями,
   если получается деление на ноль, то тоже присваеваем ноль.
   */
         arrayB[i][i] = 0;

             for (int j = 0; j < i; j++)
                 arrayB[i][j] = ( i+j == 1 ? 0 : 1./(i+j-1) );

         for (int j = i+1; j < n; j++)
                 arrayB[i][j] = 1./(i+j+1);
 }


  // дампим всю эту байду:

   cout << "Matrix A: \n" << endl;
   for( int i = 0; i<n ; i++ )
  {
     for( int j = 0 ; j < n ; j++ )
     cout << setw(4) << arrayA[i][j];
     cout << "\n\n";
  }

  cout << "Matrix D: \n" << endl;
   for( int i = 0; i<n ; i++ )
  {
     for( int j = 0 ; j < n ; j++ )
     cout << setw(4) << arrayD[i][j];
     cout << "\n\n";
  }

  cout << "Matrix B: \n" << endl;
  for( int i = 0; i<n ; i++ )
 {
    for( int j = 0 ; j < n ; j++ )
    cout << setw(11) << arrayB[i][j];
    cout << "\n\n";
 }

  // а тут типо надо сделать: C = A * B + D *A


 system("pause");
 return 0;
}


единственое что не понятно - это как написать функцию умножения матриц ?  smile 
помогите пожалуйста разобратся  smile 

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  lab12.GIF 1,56 Kb


--------------------
Have a nice day
PM   Вверх
bobik02
Дата 4.12.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 3
Всего: 14



вот кажись сделал:

Код

#include <iostream>
#include <conio>
#include <iomanip>

using namespace std;

const int n = 3;

double MatrixIncrease(double A[n][n], double B[n][n], double C[n][n])
{
  for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
      {
          C[i][j] = 0;
          for(int k = 0; k < n; k++)
              C[i][j] += (A[i][k] * B[k][j]);
      }

    return C[n][n];
}

double MatrixAddition(double A[n][n], double B[n][n], double C[n][n])
{
  for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
      {
        C[i][j] =0;
        for(int k = 0; k < n; k++)
           C[i][j] += (A[i][k] + B[k][j]);
      }

    return C[n][n];
}


int main(int argc, char* argv[])
{
  clrscr();
  randomize();

  double  arrayA[n][n];
  double  arrayB[n][n];
  double  arrayC[n][n];
  double  arrayD[n][n];
  double  arrayTMP1[n][n];
  double  arrayTMP2[n][n];

  for (int i=0; i < n; i++)
  {
     for (int j=0; j < n; j++)
     {
       arrayA[i][j] = random(30) ;
       arrayD[i][j] = random(50) ;
     }
  }

 for (int i = 0; i < n; i++)
 {
          arrayB[i][i] = 0;

             for (int j = 0; j < i; j++)
                 arrayB[i][j] = ( i+j == 1 ? 0 : 1./(i+j-1) );

         for (int j = i+1; j < n; j++)
                 arrayB[i][j] = 1./(i+j+1);
 }



   cout << "Matrix A: \n" << endl;
   for( int i = 0; i<n ; i++ )
  {
     for( int j = 0 ; j < n ; j++ )
     cout << setw(4) << arrayA[i][j];
     cout << "\n\n";
  }

  cout << "Matrix D: \n" << endl;
   for( int i = 0; i<n ; i++ )
  {
     for( int j = 0 ; j < n ; j++ )
     cout << setw(4) << arrayD[i][j];
     cout << "\n\n";
  }

  cout << "Matrix B: \n" << endl;
  for( int i = 0; i<n ; i++ )
 {
    for( int j = 0 ; j < n ; j++ )
    cout << setw(11) << arrayB[i][j];
    cout << "\n\n";
 }

  MatrixIncrease(arrayA, arrayB, arrayTMP1);
  MatrixIncrease(arrayD, arrayA, arrayTMP2);

  MatrixAddition( arrayTMP1 , arrayTMP2 ,  arrayC);

cout << "Matrix C: \n" << endl;
for( int i = 0; i<n ; i++ )
{
  for( int j = 0 ; j < n ; j++ )
  cout << setw(11) << arrayC[i][j];
  cout << "\n\n";
}

 system("pause");
 return 0;
}


вроде все правильно, что скажите ?


--------------------
Have a nice day
PM   Вверх
zkv
Дата 4.12.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(bobik02 @  4.12.2007,  21:51 Найти цитируемый пост)
вроде все правильно, что скажите ? 

ну если ты откомпилировал и все работает, то что еще сказать?  smile 
PM MAIL   Вверх
likehood
Дата 4.12.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



bobik02, как-то странно ты складываешь матрицы. Вроде так должно быть:
Код

double MatrixAddition(double A[n][n], double B[n][n], double C[n][n])
{
  for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
        C[i][j] = A[i][j] + B[i][j];

    return C[n][n];
}


P.S.: какой-то return у тебя странный - возвращаешь число, которое находится за границами массива. Зачем он вообще нужен?
PM MAIL   Вверх
bobik02
  Дата 4.12.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 3
Всего: 14



Цитата(zkv @  4.12.2007,  21:58 Найти цитируемый пост)
у если ты откомпилировал и все работает, то что еще сказать?

ну, что компилируется это как бы не показатель, могут же присутсвовать логические ошибки в алгоритме и т.к. и т.п. ... (по сему и спрашиваю)


Цитата(likehood @  4.12.2007,  22:49 Найти цитируемый пост)
P.S.: какой-то return у тебя странный - возвращаешь число, которое находится за границами массива. Зачем он вообще нужен?

честно Х.З. , я думал мож это я так массив возвращаю  smile 

Это сообщение отредактировал(а) bobik02 - 4.12.2007, 23:54


--------------------
Have a nice day
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.