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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2016, 11:55   #1
Proxaaa
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию Вычисление ранга матрицы методом окаймления миноров

Окей, всем привет, при написании программы возникла проблема - не могу составить алгоритм выделения всех миноров из матрицы, может быть вообще иду не тем путем, дайте пару подсказок по теме)
Код:
#include <stdio.h>
#include <math.h>
#include <ctime>
#include <cstdlib>
 
 
int** create_matrix(int ib, int jb)
{
    srand(time(NULL));
    int **A = new int *[ib];
    for (int i = 0; i<ib; i++)
        A[i] = new int[jb];
    for (int i = 0; i < ib; i++)
    {
        for (int j = 0; j < jb; j++)
        {
            A[i][j] = rand()%20;
        }
    }
    return A;
}
 
void create_minor(int k,int** A,int rstart,int cstart)
{
    int **B = new int *[k];
    for (int i = 0; i < k; i++)
        B[i] = new int[k];
    int ic=0, jc = 0;
 
    for (int i = rstart; ic < k; i++)
    {
        for (int j = cstart; jc < k; j++)
        {
 
            jc++;
        }
        ic++;
    }
 
 
}
 
int main()
{
    int i_border, j_border, zcount;
    zcount = 0;
    printf("Введите размеры матрицы: \n");
    scanf("%d%d\n", &i_border, &j_border);
    if (i_border <= 0 || j_border <= 0)
    {
        printf("Некорректные размеры матрицы\n");
        return 0;
    }
    int** A=create_matrix(i_border,j_border);
    for (int i = 0; i < i_border; i++)
    {
        for (int j = 0; j < j_border; j++)
        {
            if (A[i][j] != 0)
            {
                i = i_border;
                j = j_border;
            }
            else
            {
                zcount ++;
            }
        }
    }
    if (zcount == i_border*j_border)
    {
        printf("Ранг матрицы равен 0\n");
        return 0;
    }
    if (i_border>1 && j_border>1)
    {
 
        for (int k = 2; k <= (i_border < j_border ? i_border : j_border); k++)
        {
            for (int i = 0; i < i_border; i++)
            {
                for (int j = 0; j < j_border; j++)
                {
                    create_minor(k, A, i, j);
                }
            }
        }
    }
    else
    {
        printf("Ранг матрицы равен 1\n");
        return 0;
    }
}
Как видно в коде в функции create_minor я пробую перебрать все строки и столбцы для выделения из них элементов минора, но цикл проходит только строки и столбцы, стоящие рядом, первую и пятую строку, например в расчет не возьмет, если каким-либо образом увеличить инкремент в цикле, то при порядке минора больше второго начнет брать первую, третью, пятую и тд. строки/столбцы, но не первую, третью, четвертую. Вот. Или после увеличения инкремента его сбросить?
Proxaaa вне форума Ответить с цитированием
Старый 10.12.2016, 15:16   #2
Proxaaa
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию

Такс, я смотрю тема вызвала бурный ажиотаж)
Кое-что я дописал, что-то убрал, итог:
Код:
#include <stdio.h>
#include <math.h>
#include <ctime>
#include <cstdlib>




int** create_matrix(int ib, int jb)
{
	srand(time(NULL));
	int **A = new int *[ib];
	for (int i = 0; i<ib; i++)
		A[i] = new int[jb];
	for (int i = 0; i < ib; i++)
	{
		for (int j = 0; j < jb; j++)
		{
			A[i][j] = rand()%20;
		}
	}
	return A;
}

int create_minor(int order, int** A,int i,int j,int step1,int step2,int i_border,int j_border)
{
	int temp1, temp2,ic,jc,temp_i,temp_j;
	temp1 = step1;
	temp2 = step2;
	ic = 0;
	jc = 0;
	int** minor = create_matrix(order, order);
	for (int im = 0;ic < order; im+=step1)
	{
		for (int jm = 0; jc < order; jm+=step2)
		{
			minor[im][jm] = A[i + im][j + jm];
			jc++;
			if (jm>0)
				step2 = 1;
			temp_j = j + jm;
		}
		ic++;
		if (im>0)
			step1 = 1;
		temp_i = i + im;
	}
	step1 = temp1;
	step2 = temp2;
	if (determinant(minor) != 0)
	{
		order++;
		delete[] minor;
		create_minor(order,A,i,j,1,1,i_border,j_border);
	}
	else
	{
		if (temp_j<j_border)
		{
			delete[] minor;
			step2++;
			create_minor(order, A, i, j,step1,step2,i_border,j_border);
		}
		else
		{
			if (temp_i < i_border)
			{
				delete[] minor;
				step1++;
				step2 = 1;
				create_minor(order, A, i, j, step1, step2,i_border,j_border);
			}
		}
	}
	delete[] minor;
	return order;
}

bool determinant(int* B[])
{

}

int main()
{
	int i_border, j_border, order, rang;
	rang = 0;
	order = 2;
	printf("Введите размеры матрицы: \n");
	scanf("%d%d\n", &i_border, &j_border);
	if (i_border <= 0 || j_border <= 0)
	{
		printf("Некорректные размеры матрицы\n");
		return 0;
	}
	int** A = create_matrix(i_border, j_border);
	for (int i = 0; i < i_border; i++)
	{
		for (int j = 0; j < j_border; j++)
		{
			if (A[i][j] != 0)
			{
				rang = 1;
				j = j_border;
				i = i_border;
			}
		}
	}
	
	if (i_border > 1 && j_border > 1)
	{
		for (int i = 0; i < i_border - 1; i++)
		{
			for (int j = 0; j < j_border - 1; j++)
			{
				rang=create_minor(order, A, i, j, 1, 1,i_border,j_border);
			}
		}
	}
	return rang;
}
Осталось написать функцию для вычисления определителя миноров. Может кого-то тема все-таки заинтересует...
Proxaaa вне форума Ответить с цитированием
Старый 10.12.2016, 15:46   #3
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Proxaaa Посмотреть сообщение
Кое-что я дописал, что-то убрал,
Метод проб и ошибок?

Цитата:
Сообщение от Proxaaa Посмотреть сообщение
Осталось написать функцию для вычисления определителя миноров.
А что там вычислять?
Рекурсивно вычисляете определитель порядка N через определители порядка N-1 ... и так пока N не станет 2 или 1 (это уже дело вкуса).
Здесь расписано: Определитель
А здесь (в тексте и в архиве) есть готовый код: Задачи по программированию на языке C++.
Написано на C++ правда, но это только для укорочения рутины.
olej.tsil вне форума Ответить с цитированием
Старый 10.12.2016, 16:11   #4
Proxaaa
Новичок
Джуниор
 
Регистрация: 10.12.2016
Сообщений: 3
По умолчанию

Спасибо за советы, с определителями уже разобрался, однако всплыла та же самая проблема что и изначально - моя функция не перебирает все миноры(
Proxaaa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление обратной матрицы методом Гаусса пусеныш Общие вопросы Delphi 2 22.04.2016 10:23
Вычисление миноров матрица 3х3 Pascal che91 Помощь студентам 3 14.02.2012 18:08
Решение слау методом окаймления (туплю сильно) ROD Свободное общение 0 05.11.2010 21:28
Решение СЛАУ методом окаймления (теория) ROD Свободное общение 0 22.09.2010 23:29
Вычисление обратной матрицы методом Гаусса Штудент Общие вопросы C/C++ 0 07.12.2008 14:17