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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 19:51   #1
hello19
Пользователь
 
Регистрация: 19.07.2011
Сообщений: 18
По умолчанию Не пойму где косяк в коде

Есть матрица порядка 3638. Нужно найти обратную к ней. ( В последствии порядок матрицы - около 100 000)
Есть код, но не совсем рабочий. На матрицах порядка 3-4 он работает отлично, а на матрице порядка 3638 - не работает. Результат - исходн матрица
Помогите найти косяк. И по возможности сделать код "по-шустрее"
Код:
template <typename T> void FreeMem(T **matr, int n);
template <typename T> void PrintMtx(T **matr, int n);
template <typename T> void SetMtx(T **matr, int n);
template <typename T> void TransponMtx(T **matr, T **tMatr, int n);
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol);
double Det(double **matr, int n);
 
void main()
{
    srand((unsigned)time(NULL));
    setlocale(0, "");
    int n; 
	double det;
    cout << "Введите размер матрицы: ";
    cin >> n;
    double **matr = new double * [n];
    double **obr_matr = new double * [n];
    double **tobr_matr = new double * [n];
    for(int i = 0; i < n; i++)
		{
            matr[i] = new double[n];
            obr_matr[i] = new double[n];
            tobr_matr[i] = new double[n];
        }
	
        SetMtx(matr, n);
        PrintMtx(matr, n);
        det = Det(matr, n);
        cout << "Определитель матрицы = " << det << endl;
        if(det){
                for(int i = 0; i < n; i++){
                        for(int j = 0; j < n; j++){
                                int m = n - 1;
                                double **temp_matr = new double * [m];
                                for(int k = 0; k < m; k++)
                                        temp_matr[k] = new double[m];
                                Get_matr(matr, n, temp_matr, i, j);
                                obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
                                FreeMem(temp_matr, m);
                        }
                }       
        }
        else
  cout << "Т.к. определитель матрицы = 0,\nто матрица вырожденная и обратной не имеет!!!" << endl;
        //Транспонирование матрицы
        TransponMtx(obr_matr, tobr_matr, n);
        //Печать обратной матрицы после транспонирования
        PrintMtx(tobr_matr, n);
		// Освобождение памяти
        FreeMem(tobr_matr, n);
        FreeMem(matr, n);
        FreeMem(obr_matr, n);
}
//Транспонирования матрицы
template <typename T> void TransponMtx(T **matr, T **tMatr, int n){
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < n; j++)
			tMatr[j][i] = matr[i][j];
}
//Освобождения памяти
template <typename T> void FreeMem(T **matr, int n)
{
        for(int i = 0; i < n; i++)
                delete [] matr[i];
        delete [] matr;
}
//Заполнения матрицы
template <typename T> void SetMtx(T **matr, int n)
{
	ifstream ifs1("3.txt");
        for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
				{
					ifs1 >> matr[i][j];
				}
}
//Печати матрицы
template <typename T> void PrintMtx(T **matr, int n)
{
	ofstream ofs4("2.txt");
        for (int i = 0; i < n; i++){
                for (int j = 0; j < n; j++)
					ofs4 << matr[i][j] << " ";
				ofs4 << endl;
		}                
}
//Вычеркивания строки и столбца
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol)       
{
        int ki = 0; 
        for (int i = 0; i < n; i++){
                if(i != indRow){
                        for (int j = 0, kj = 0; j < n; j++){
                                if (j != indCol){
                                        temp_matr[ki][kj] = matr[i][j];
                                        kj++;
                                }
                        }
                        ki++;           
                }
        }
}
 //Вычисления определителя матрицы
double Det(double **matr, int n)      
{
        double temp = 0;   //временная переменная для хранения определителя
        int k = 1;              //степень
        if(n < 1){
                cout<<"Неверный размер матрицы!!!" << endl;
        return 0;
    }
        else if (n == 1)
                temp = matr[0][0];
        else if (n == 2)
                temp = matr[0][0] * matr[1][1] - matr[1][0] * matr[0][1];
        else{
                for(int i = 0; i < n; i++){
                        int m = n - 1; 
                        double **temp_matr = new double * [m];
                        for(int j = 0; j < m; j++)
                                temp_matr[j] = new double [m];
                        Get_matr(matr, n, temp_matr, 0, i);
                        temp = temp + k * matr[0][i] * Det(temp_matr, m);
                        k = -k;
                        FreeMem(temp_matr, m);
                }
        }
        return temp;
}
Прикрепил txt
1.txt - матрица порядка 4 (пробная)
2.txt - сюда записывается результат работы программы
3.txt - матрица порядка 3638
Вложения
Тип файла: rar текстовые.rar (139.0 Кб, 6 просмотров)
hello19 вне форума Ответить с цитированием
Старый 21.07.2011, 21:05   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

template <typename T> void SetMtx(T **matr, int n);

double **matr = new double * [n];

SetMtx(matr, n);

Я уже в этих строчках вижу "косяк". Вопрос к вам, чему у вас равен тип T, когда вы вызываете SetMtx(matr, n);?! Точнее говоря, какой тип у параметра matr в результате инстанциации вашей функции для аргумента matr?!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написал программу, где то ошибка, не пойму где... Kelevra91 Общие вопросы C/C++ 5 17.01.2011 16:38
Найдите косяк в коде Kingcss Общие вопросы Delphi 2 02.01.2011 08:35
где-то ошибаюсь, а где не пойму!укажите ошибку <<Katushka>> Общие вопросы C/C++ 2 15.05.2010 11:41
не пойму где ошибка C-Jay Общие вопросы C/C++ 1 03.01.2010 01:45
Косяк в коде Dimon88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 18.09.2008 18:09