IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Матрицы (С++)
Димас
сообщение 3.12.2007 23:06
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


есть задача:

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




единственное что не ясно с задачи - как сделать матрицу B ? mega_chok.gif

думал так вот:

const int n = 3;
...
for (int i = 0 ; i < n; i++)
  {
     for (int j = 0 ; j < n; j++)
     {
        if ( i < j)
       {
         arrayB[i][j] = 1 /  (i + j -1)  ;
       }
        else
       {
         arrayB[i][j] = 1 / (i + j + 1) ;
       }
     }
  }
...



но єто маразм какой то получаеться no1.gif

Сообщение отредактировано: Димас - 3.12.2007 23:46


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2007 23:25
Сообщение #2


Гость






Картинку присоедини к посту, она не открывается: "You don't have permission to access /lab12.GIF on this server."
 К началу страницы 
+ Ответить 
Димас
сообщение 3.12.2007 23:43
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


Цитата(volvo @ 4.12.2007 0:25) *

Картинку присоедини к посту, она не открывается: "You don't have permission to access /lab12.GIF on this server."

перезалил...


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2007 0:54
Сообщение #4


Гость






Цитата
но єто маразм какой то получаеться
Почему же маразм? Все правильно получается, хотя можно и короче:

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

(непонятно, что будет с элементами главной диагонали, правда... В моем случае они будут считаться как 1 / (i + j + 1), хотя в условии этого не оговорено.)
 К началу страницы 
+ Ответить 
Димас
сообщение 4.12.2007 19:05
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


volvo , моя ошибка была в том что я матрицу B обявил как int , а там же получается надо например double ...
но сделал я все таки вот так :
 
const int n = 3;
double b[n][n];
int i, j;

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

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

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


В данном случае главную диагональ заполняем нулями, если получается деление на ноль, то тоже присваеваем ноль.

Сообщение отредактировано: Димас - 4.12.2007 20:48


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Димас
сообщение 4.12.2007 20:49
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


теперь вопрос как умножить две матрицы ?

поискал гуглом нашел такое:
Умножения двух матриц
но дык, это ж не правильно ?!

я вот посмотрел как матрицы умножаютмя на: Википедиа (там написано Умножение матриц не коммутативно!)
я понимаю как матрицы умножаются на "бумаге" .
но не могу сделать алгоритм ... wacko.gif


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.12.2007 20:55
Сообщение #7


Гость






Цитата
но дык, это ж не правильно ?!
Вот когда ты напишешь СВОЙ алгоритм - обязательно выложи его сюда, чтоб я тоже мог не глядя написать: "и это тоже неправильно!"

Почему неправильно? "Какие Ваши аргументы" (С), как говорится? Что не так в программе? Или "не читал, но осуждаю"?
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 4.12.2007 21:14
Сообщение #8


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата(Димас @ 4.12.2007 19:49) *

я понимаю как матрицы умножаются на "бумаге" .


понимаешь? объясни. это и будет алгоритм.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Димас
сообщение 4.12.2007 21:30
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 90
Пол: Мужской
Реальное имя: Дима

Репутация: -  1  +


Цитата(volvo @ 4.12.2007 21:55) *

Или "не читал, но осуждаю"?

нет я не осуждаю а пытаюсь понять...

Цитата(volvo @ 4.12.2007 21:55) *

Почему неправильно? "Какие Ваши аргументы" (С), как говорится? Что не так в программе?


Вы абсолютно правы... (мои аргументы были ошибочными mega_chok.gif )
просто я не до конца понял как работает алгоритм, только что взял расписал все на бумаге, оказалось что все работает wink.gif

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

#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";
 }

  // A*B
  MatrixIncrease(arrayA, arrayB, arrayTMP1);
  // D*A
  MatrixIncrease(arrayD, arrayA, arrayTMP2);

  // C = A*B + D*A
  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;
}



Сообщение отредактировано: Димас - 4.12.2007 21:45


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 24.07.2025 5:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"