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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Матрицы (С++)
сообщение
Сообщение #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

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


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

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


Гость






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


Пионер
**

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

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


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

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

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


--------------------
Каждый человек , которого я знаю встречаю, превосходит меня в какой нить области, и я готов у него этому учится:)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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), хотя в условии этого не оговорено.)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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);
}


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

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


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


Пионер
**

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

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


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

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

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


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

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


Гость






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

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


Michael_Rybak
*****

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

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


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

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


понимаешь? объясни. это и будет алгоритм.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
}



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


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

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

 





- Текстовая версия 28.01.2021 8:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name