Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрицы (С++)
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Димас
есть задача:

Дано две квадратические матрицы 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
volvo
Картинку присоедини к посту, она не открывается: "You don't have permission to access /lab12.GIF on this server."
Димас
Цитата(volvo @ 4.12.2007 0:25) *

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

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

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), хотя в условии этого не оговорено.)
Димас
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);
}


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

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

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

Почему неправильно? "Какие Ваши аргументы" (С), как говорится? Что не так в программе? Или "не читал, но осуждаю"?
Michael_Rybak
Цитата(Димас @ 4.12.2007 19:49) *

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


понимаешь? объясни. это и будет алгоритм.
Димас
Цитата(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;
}

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.