Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2009, 15:27   #1
batias
 
Регистрация: 03.06.2009
Сообщений: 6
По умолчанию Вопрос по умножению матриц на C++

Здравствуйте, имеется программа для умножения матриц, и в принципе умножает, но не всё.
При умножении:
1 2 3
4 5 6
на
1 0 0 0
0 1 0 0
0 0 1 0

Должно получится:
1 2 3 0
4 5 6 0

А получается что-то вроде
1 2 3 1.56456е+456
4 5 6 1.56468е-546

Т.е вместо нулей на конце получается бесконечно малое число 1.56456е+456, собственно в этом весь вопрос как получить на конце нормальные нули?


Код:
#include <cstdlib>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

const int str=10,stolb=10;
int k,l,p;
void input_matrix(double A[][stolb],int m, int n, char name) // Функция ввода
{
     for (int i=0;i<m;i++)
     {
         for(int j=0;j<n;j++)
         {
                 cin>>A[i][j];
         }
     }
}
void output(double result[][stolb],int m,int n, char name) // функция вывода
{
     for(int i=0;i<m;i++)
         {for (int j=0;j<n;j++)
              { 
                   cout<<"  "<<result[i][j];
              }
              cout<<endl;
         }
}
void multiply(double A[][stolb],double B[][stolb],double C[][stolb]) // функция умножения
{     for(int i=0;i<k;i++)
     {
             for (int j=0;j<l;j++)
             {
                 C[i][j]=0;
                 for(int t=0;t<l;t++)
                 {
                         C[i][j] +=A[i][t]*B[t][j];
                 }
                 
                 cout<<endl;
             }
     
     }
     
}
              
int main()
{
START: cout<<" Input number lines and column matrix's A"<<endl; // Вводим количество строк и столбцов матрицы А
cin>>k;
cin>>l;
cout<<"Input number column matrix's B"<<endl; // Вводим кол-во столбцов матрицы B
cin>>p;
cout<<endl;
 double A[str][stolb];
 double B[str][stolb];
 double C[str][stolb];
 cout<<"Input elements of A"<<endl; // Вводим элементы первой матрицы
 input_matrix(A,k,l,'A');
 cout<<"Input elements of B"<<endl; // вводим элементы второй матрицы
 input_matrix(B,l,p,'B');
 cout<<"A:"<<endl; // Матрица А
 output(A,k,l,'A');
 cout<<"B:"<<endl; // Матрица B
 output(B,l,p,'B'); 
 multiply(A,B,C);
 cout<<"C:"<<endl; // Выводим результат
 output(C,k,p,'C');
  system("PAUSE");
    goto START; // повторяем цикл
  return 0;
      }

Последний раз редактировалось batias; 03.06.2009 в 17:26.
batias вне форума Ответить с цитированием
Старый 03.06.2009, 15:52   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Может как-то так...
Код:
 
#include <iomanip>
...
cout<<"  "<<setiosflags(ios::fixed)<<setprecision(0)<<result[i][j];
...
Uguu~

Последний раз редактировалось __STDC__; 03.06.2009 в 15:58.
__STDC__ вне форума Ответить с цитированием
Старый 03.06.2009, 17:02   #3
batias
 
Регистрация: 03.06.2009
Сообщений: 6
По умолчанию

Пока нет возможности проверить( А можно краткое описание работы этой строки?

Откомпилировал теперь на конце "-92559631349317830000000000000000" опять же вместо ноля( В чем может быть дело в любом другом столбце ноль ставится, но только не в последнем.

Последний раз редактировалось Stilet; 22.06.2009 в 12:56.
batias вне форума Ответить с цитированием
Старый 03.06.2009, 17:24   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

setiosflags(ios::fixed) представляет число в формате с фиксированной точкой (без E), setprecision(0) устанавливает кол-во знаков после запятой...
Цитата:
Откомпилировал теперь на конце "-92559631349317830000000000000000" опять же вместо ноля( В чем может быть дело в любом другом столбце ноль ставится, но только не в последнем.
О_О
сейчас проверю еще раз...

/*В Dev-Cpp проверял*/
Мой вариант кода (красным изменения):
Код:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
const int str=10,stolb=10;
int k,l,p;
void input_matrix(double A[][stolb],int m, int n) // Функция ввода
{
     for (int i=0;i<m;i++)
     {
         for(int j=0;j<n;j++)
         {
                 cin>>A[i][j];
         }
     }
}
void output(double result[][stolb],int m,int n) // функция вывода
{
     for(int i=0;i<m;i++)
         {for (int j=0;j<n;j++)
              { 
                cout<<"  "<<setiosflags(ios::fixed)<<setprecision(0)<<result[i][j];
              }
              cout<<endl;
         }
}
........
Скриншот:
Изображения
Тип файла: jpg 31245.jpg (18.9 Кб, 140 просмотров)
Uguu~

Последний раз редактировалось Stilet; 22.06.2009 в 12:54.
__STDC__ вне форума Ответить с цитированием
Старый 03.06.2009, 17:48   #5
batias
 
Регистрация: 03.06.2009
Сообщений: 6
По умолчанию

Компилирую тоже самое в Visual C++ 2008, выдает

Спасибо за помощь завтра попробую в универе на Dev-Cpp.
Изображения
Тип файла: jpg 123.jpg (25.8 Кб, 138 просмотров)

Последний раз редактировалось Stilet; 22.06.2009 в 12:57.
batias вне форума Ответить с цитированием
Старый 03.06.2009, 18:02   #6
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от batias Посмотреть сообщение
Спасибо за помощь завтра попробую в универе на Dev-Cpp.
блин.. не знаю даже, что бы посоветовать.. попробуйте использовать printf что ли... как-нибудь
Код:
printf("%.0f ",result[i][j]);
вдруг поможет =)
Uguu~

Последний раз редактировалось __STDC__; 03.06.2009 в 18:04.
__STDC__ вне форума Ответить с цитированием
Старый 03.06.2009, 23:56   #7
batias
 
Регистрация: 03.06.2009
Сообщений: 6
По умолчанию

Дело было вот в чём
Цитата:
for (int j=0;j<l;j++)

j изменяется до j<l, а должно до j<p
Ещё раз благодарю за помощь.

Помогите дополнить прогрмму чтобы считался ещё и определитель конечной матрицы. Код для вычисления определителя нашёл но прикрутить его не получается (выдает кучу ошибок).
Помогите если не сложно, сам быстро не разберусь(

моя программа
Код:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
const int str=10,stolb=10;
int k,l,p;
void input_matrix(double A[][stolb],int m, int n, char name) // Функция ввода
{ 
     cout<<"Input elements of "<<name<<endl;
     for (int i=0;i<m;i++)
     { 
         for(int j=0;j<n;j++)
         { 
                 cin>>A[i][j];
         }
     }
}
void output(double result[][stolb],int m,int n, char name) // функция вывода
{ cout<<"Matrix:"<<name<<endl;
     for(int i=0;i<m;i++)
         {for (int j=0;j<n;j++)
              { 
                   cout<<"  "<<result[i][j];   
              }
              cout<<endl;
         }
     cout<<"____________"<<endl;
}
void multiply(double A[][stolb],double B[][stolb],double C[][stolb]) // функция умножения
{     for(int i=0;i<k;i++)
     {
             for (int j=0;j<p;j++) //J должно быть меньше P, а не L
             {
                 C[i][j]=0;
                 for(int t=0;t<l;t++)
                 {
                         C[i][j] +=A[i][t]*B[t][j];
                 }
             }
     }
}
void trans(double C[][stolb],double D[][stolb]) //Транспонирование
   
{     for(int i=0;i<k;i++)
     {
             for (int j=0;j<p;j++)
             {

                         D[i][j]=C[j][i];
             }
     } 
}    

int main()
{
START: cout<<" Input number lines and column matrix's A"<<endl; // Вводим количество строк и столбцов матрицы А
cin>>k;
cin>>l;
cout<<"Input number column matrix's B"<<endl; // Вводим кол-во столбцов матрицы B
cin>>p;
cout<<endl;
 double A[str][stolb];
 double B[str][stolb];
 double C[str][stolb];
 double D[str][stolb];
 input_matrix(A,k,l,'A');
 input_matrix(B,l,p,'B');

 output(A,k,l,'A');
 output(B,l,p,'B'); 

 multiply(A,B,C);
 output(C,k,p,'C');

trans(C,D);
output(D,k,p,'D');

	
  system("PAUSE");
    goto START; // повторяем цикл
  return 0;
      }

программа для нахождения определителя
Код:
#include <stdio.h>
#include <conio.h>
 
void printMatrix(float** B, int n)	//print the matrix
{
	printf("\n");
	int x ,y;
	for(y=0; y<n; y++)
	{
		for(x=0; x<n; x++)
			printf("%7.2f", B[x][y]);
 
		printf("\n");
	}
	printf("\n");
}
 
//determinant razlozheniem po 1-oj stroke
float det(float **p, int n)
{
	int i,h,x,y;
	if(n==1)
		return **p;
  
	float d=0;
	for(i=0; i<n; ++i)
	{
		float **add = new float*[n-1];
		for(h=0; h<n-1; ++h)
			add[h] = new float[n-1];
    
		for(y=1; y<n; y++)
			for(x=0; x<n; x++)
			{
				if(x==i) continue;
				if(x<i)
				    add[x][y-1] = p[x][y];
				else
					add[x-1][y-1] = p[x][y];
			}
 
		if(i%2) p[i][0] = -p[i][0];
	    d += p[i][0]*det(add, n-1);
 
	    for(h=0; h<n-1; ++h)
		    delete[] add[h];
		delete[] add;
	}
 
	return d;
}
 
int main()
{
	int n=4,
		x, y;
  
	float **array = new float*[n];
	for(x=0; x<n; x++) 
		array[x] = new float[n];
 
	for(y=0; y<n; ++y)
		for(x=0; x<n; ++x)
			scanf("%f",  &array[x][y]);
    
	printMatrix(array, n);
	printf("determinant = %f\n", det(array, n));
	getch();
 
	for(x=0; x<n; ++x)
		delete[] array[x];
	delete[] array;
 
    return 0;
}

Последний раз редактировалось Stilet; 22.06.2009 в 12:57.
batias вне форума Ответить с цитированием
Старый 16.06.2009, 17:13   #8
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Ну код не смотрел, но если разложением по первой строке, то т.о. вы посчитаете детерминант матрицы 4*4 максимум... Вообще я всегда детерминант считал при помощи LU-разложения... даже код выкладывал, правда на паскале... но там переделать несложно.. поищите

***
хотя можно и разложением... только тогда к примеру из матрицы 5*5 порядка получите 5 матриц 4*4 и придется для каждой считать еще раз все... в общем это все не стоит того =)
Uguu~

Последний раз редактировалось __STDC__; 16.06.2009 в 17:15.
__STDC__ вне форума Ответить с цитированием
Старый 22.06.2009, 12:24   #9
batias
 
Регистрация: 03.06.2009
Сообщений: 6
По умолчанию

Нашел код для LU разложения, прикрутил его к своей проге, определитель счтает. Но когда на главной диагонали стоит 0 определитель считается не верно.
Код:
//#include <vcl.h>
#include <stdio.h>
#include <conio.h>
 
void show_matrix(float **matrix, int n)
{
  for(int i=0; i<n; i++) {
    for(int j=0; j<n; j++) printf("%5.1f", matrix[i][j]);
    printf("\n");
  }
  printf("\n");
}

/* 
char bufRus[256];
char *Rus(const char *text)
{
  CharToOem(text, bufRus);
  return bufRus;
}
*/
 
main()
{
  int n;
  float **matrix;
  float det = 1;
  printf("Vvedite porjadok matr: ");
  scanf("%i", &n);
  matrix = new float*[n];
  for(int i = 0; i<n; ++i)  matrix[i] = new float[n];
  for(int i=0; i<n; i++) {
    for(int j=0; j<n; j++) {
      printf("A(%i, %i) = ", i+1, j+1);
      scanf("%f", &matrix[i][j]);
    }
  }
  printf("\n");
  show_matrix(matrix, n);
  getch();
  for(int i=0; i<n; i++) {
    if(!matrix[i][i]) {                              //ошибка где-то в этом цикле
      for(int j=i+1; j<n; j++) {
        if(matrix[j][i]) {
          for(int k=0; k<n; k++) matrix[i][k] += matrix[j][k];
          show_matrix(matrix, n);
          break;
        }
      }
    }

    if(matrix[i][i]) {
      for(int j=i+1; j<n; j++) {
        float o = matrix[j][i]/matrix[i][i];
        for(int k=0; k<n; k++) matrix[j][k] -= matrix[i][k]*o;
        if(o) show_matrix(matrix, n);
      }
    }
  }
  for(int i=0; i<n; i++) det *= matrix[i][i];
  if(det) printf("Opredelitel raven: %.2f", det);
  else printf("Opredelitel raven: 0");
  getch();
  for(int i=0; i<n; i++) delete[] matrix[i];
  delete[] matrix;
}
batias вне форума Ответить с цитированием
Старый 22.06.2009, 12:37   #10
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от batias Посмотреть сообщение
Нашел код для LU разложения, прикрутил его к своей проге, определитель счтает. Но когда на главной диагонали стоит 0 определитель считается не верно.
ну это логично, если посмотреть внимательно на метод, то сразу видно, что наличие нулей на главной диагонали запрещено..
можно этого избежать.. например если представить строку, где стоит ноль, как линейную комбинацию других.. ну там прибавить какую-нибудь строку, чтобы не было нуля... от этого определитель не меняется..
Uguu~
__STDC__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка Матриц(Упорядочивание Элементов,Вывод На Экран Матриц При Условии...) timepoka Помощь студентам 8 01.07.2011 13:20
Преобразование матриц bpystep Помощь студентам 8 23.03.2009 12:54
транспонирование матриц kate158 Общие вопросы Delphi 7 21.12.2008 16:39