Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
serg_kpi
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 5
1

Определить ранг матрицы

12.09.2014, 13:44. Просмотров 2919. Ответов 6
Метки нет (Все метки)

привет всем.я написал код ввода-вывода матрицы,а мне надо посчитать ранг матрицы..сижу уже 2 день,не могу ничего придумать..перерыл весь гугл..если у кого-то есть код или кто-то может написать этот код,пожалуйста помогите.
вот то,что есть у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <conio.h>
 
const int n = 10;
const int m = 10;
 
int main () {
setlocale(LC_ALL, "Russian");
 
int X[n][m]; 
int i,j;    
 
for (i = 0; i < n ; i++)
for (j = 0; j < m ; j++){   
std::cout<<"Введите значение Х["<<i<<","<<j<<"] = "; 
std::cin>>X[i][j];  
}
std::cout<<"\n"; 
std::cout<<"Ваш массив"<<"\n";
for (i = 0; i < n ; i++){   
std::cout<<"\n";
for (j = 0; j < n ; j++){
    
    std::cout<<X[i][j]<<"\t"; 
}
}
getch();    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2014, 13:44
Ответы с готовыми решениями:

Определитель матрицы, ранг матрицы, обратная матрица
Вы можете помочь, сделать определитель матрицы, или у кого есть коде: ранг...

Ранг матрицы
Доброго времени суток. Может кто-либо помочь с кодом на вычисление ранга...

Ранг прямоугольной матрицы
Ребят, может у кого завалялся какой-нибудь метод для нахождения ранга...

Найти ранг матрицы
Найти ранг прямоугольной матрицы A(m,n) методом Гаусса.Покажите пожалуйста на...

Ранг матрицы. Параметр функции
Функция для определения ранга матрицы. Что нужно передать в первый аргумент...

6
sourcerer
Модератор
Эксперт CЭксперт С++
4868 / 2053 / 325
Регистрация: 20.02.2013
Сообщений: 5,556
Записей в блоге: 24
Завершенные тесты: 1
12.09.2014, 14:05 2
Цитата Сообщение от serg_kpi Посмотреть сообщение
мне надо посчитать ранг матрицы
Это как?

Не по теме:


P.S. Код свой между вот таких тэгов запихивайте:

[СPP]

// тут должен быть С++ код

[/СPP]

C++
1
// С++ код, оформленный в тэги

0
serg_kpi
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 5
12.09.2014, 14:14  [ТС] 3
http://mathprofi.ru/rang_matricy.html вот тут есть...если поможете,буду очень благодарен.

Добавлено через 1 минуту
gru74ik, http://mathprofi.ru/rang_matricy.html вот тут есть...если поможете,буду очень благодарен.
0
serg_kpi
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 5
12.09.2014, 14:49  [ТС] 4
переведите пожалуйста код в С++ или С.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{Найти ранг матрицы
}
 
var
  n,m,min,l,k,j,rang: byte;
  a: array [1..10, 1..10] of real;
  sz: real;
begin
  randomize;
  write('n m =');readln(n,m);
  for l:=1 to n do
  begin
    for k:=1 to m do
    begin
      a[l,k]:=1.0*random(11)-5; write(' ', a[l,k]:5:2);
    end;
    writeln;
  end;
    
  
  if n<m then min:=n else min:=m;
 
  for k:=1 to min do
    for l:=1 to n do
       if l<>k then begin
          if a[k,k]<>0 then 
          begin
           sz:=a[l,k]/a[k,k];
           for j:=1 to m do a[l,j]:=a[l,j]-sz*a[k,j]
          end;
        end;
 
  rang:=0;
  for l:=1 to min do if a[l,l]<>0 then inc(rang);
  
  writeln;
  for l:=1 to n do
  begin
    for k:=1 to m do
      write(' ', a[l,k]:5:2);
    writeln;
  end;
 
  writeln('rang=',rang);
  readln;
end.
0
sourcerer
Модератор
Эксперт CЭксперт С++
4868 / 2053 / 325
Регистрация: 20.02.2013
Сообщений: 5,556
Записей в блоге: 24
Завершенные тесты: 1
12.09.2014, 14:57 5
serg_kpi, ну, наверное надо сперва план написать. Алгоритм.
1) Ранг нулевой матрицы любых размеров равен нулю. Значит надо ввести проверку на пустую матрицу (заполненную нулями), например написать соответствующую функцию.
2) Если столбцы (или строки, тут не важно) пропорциональны, то ранг матрицы равен единице. Значит надо придумать функцию, проверяющую пропорциональность строк (линейные зависимости).
3) Сколько линейно независимых столбцов (строк), таково и значение ранга, но не больше минимальной размерности матрицы. Значит пишем функцию проверки с двумя условиями - на линейные зависимости строк, но чтобы значения ранга не превышало значения row и col.
0
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
12.09.2014, 15:19 6
вот.

Поищи, там есть метод rang(). Если реализован норм, то вопрос будет закрыт)
0
Вложения
Тип файла: rar matrix.rar (3.7 Кб, 54 просмотров)
sourcerer
Модератор
Эксперт CЭксперт С++
4868 / 2053 / 325
Регистрация: 20.02.2013
Сообщений: 5,556
Записей в блоге: 24
Завершенные тесты: 1
12.09.2014, 17:30 7
Вот предварительно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//   Напишите программу, которая принимает от пользователя значения
//   значения двух целочисленных переменных row и col (используйте
//   эти значения для задания размерности матрицы), создаёт матрицу
//   (используйте динамические массивы) и считает ранг матрицы.
//   Затем выводит на экран значения элементов матрицы и
//   отдельной строкой выводит значение ранга матрицы.
 
#include <iostream>
#include <windows.h>
 
void fill_matrix(int ** matrix, int row, int col);            // 1
void show_matrix(int ** matrix, int row, int col);            // 2
int calc_rank(int ** matrix, int row, int col, int rank);     // 3
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int matrix_rank = 0;
    int row, col;
 
    std::cout << "Здравствуйте! Вас приветствует программа умеющая\n"
                 "создавать матрицы и находить их ранг.\n";
 
    std::cout << "Введите количество рядов: ";
    std::cin >> row;
 
    std::cout << "Введите количество столбцов: ";
    std::cin >> col;
 
    int ** matrix = new(std::nothrow) int * [row];    // выделяем память
    for (int i=0; i<row; ++i)                       // для нашей матрицы
        matrix[i] = new(std::nothrow) int[col];     // размера row(x)col
    std::cout << "Заполните массив значениями." << std::endl;
    fill_matrix(matrix, row, col);
 
    std::cout << std::endl;
    std::cout << "\nВот как Вы заполнили Вашу матрицу:\n";
    show_matrix(matrix, row, col);
    
    std::cout << "Ранг матрицы равен: " << calc_rank(matrix, row, col, matrix_rank);
    
    for (int i = 0; i < row; i++)
        delete [] matrix[i];      //освобождаем память
    delete [] matrix;
    
    return 0;
}
 
// 1 - заполнение матрицы пользователем
void fill_matrix(int ** matrix, int row, int col)
{
    for (int i=0; i<row; ++i)
        for (int j=0; j<col; ++j)
        {
            std::cout << "Введите значение элемента matrix["
                      << i <<"][" << j << "]: ";
            std::cin >> matrix[i][j];
        }
}
 
// 2 - вывести содержимое матрицы на экран
void show_matrix(int ** matrix, int row, int col)
{
    for (int i=0; i<row; ++i)
    {
        for (int j=0; j<col; ++j)
            std::cout << "[" << i << "]" << "[" << j
                      << "] == " << matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
 
// 3 - посчитать ранг матрицы
int calc_rank(int ** matrix, int row, int col, int matrix_rank)
{
    // код функции, например можно попробовать передрать отсюда:
    // [url]http://www.cyberforum.ru/cpp-beginners/thread965095.html[/url]
    return matrix_rank;
}
Добавлено через 1 час 18 минут
Во, прошаренный алгоритм.

Добавлено через 12 минут
А вот и готовая функция.

Добавлено через 36 минут
В общем, вот, но чё-то не работает. Короче, доработать напильником )))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
//   Напишите программу, которая принимает от пользователя значения
//   значения двух целочисленных переменных row и col (используйте
//   эти значения для задания размерности матрицы), создаёт матрицу
//   (используйте динамические массивы) и считает ранг матрицы.
//   Затем выводит на экран значения элементов матрицы и
//   отдельной строкой выводит значение ранга матрицы.
 
#include <iostream>
#include <windows.h>
 
void fill_matrix(double ** matrix, int row, int col);  // 1
void show_matrix(double ** matrix, int row, int col);  // 2
int l_min(int a, int b);                               // 3
double det_matrix(double * matrix[], int n);           // 4
int calc_rank(double ** matrix, int row, int col);     // 5
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int row, col;
 
    std::cout << "Здравствуйте! Вас приветствует программа умеющая\n"
                 "создавать матрицы и находить их ранг.\n";
 
    std::cout << "Введите количество рядов: ";
    std::cin >> row;
 
    std::cout << "Введите количество столбцов: ";
    std::cin >> col;
 
    double ** matrix = new(std::nothrow) double * [row];    // выделяем память
    for (int i=0; i<row; ++i)                       // для нашей матрицы
        matrix[i] = new(std::nothrow) double[col];     // размера row(x)col
    std::cout << "Заполните массив значениями." << std::endl;
    fill_matrix(matrix, row, col);
 
    std::cout << std::endl;
    std::cout << "\nВот как Вы заполнили Вашу матрицу:\n";
    show_matrix(matrix, row, col);
 
    std::cout << "Ранг матрицы равен: " << calc_rank(matrix, row, col);
 
    for (int i = 0; i < row; i++)
        delete [] matrix[i];      //освобождаем память
    delete [] matrix;
 
    return 0;
}
 
// 1 - заполнение матрицы пользователем
void fill_matrix(double ** matrix, int row, int col)
{
    for (int i=0; i<row; ++i)
        for (int j=0; j<col; ++j)
        {
            std::cout << "Введите значение элемента matrix["
                      << i <<"][" << j << "]: ";
            std::cin >> matrix[i][j];
        }
}
 
// 2 - вывести содержимое матрицы на экран
void show_matrix(double ** matrix, int row, int col)
{
    for (int i=0; i<row; ++i)
    {
        for (int j=0; j<col; ++j)
            std::cout << "[" << i << "]" << "[" << j
                      << "] == " << matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
 
// 3 - проверить порядок матрицы
int l_min(int a, int b)
{
    if(a>=b)
        return b;
    else
        return a;
}
 
// 4 - нахождение детерминанта матрицы
double det_matrix(double * matrix[], int n) // я задаю не саму матрицу, а ссылку на нее (*M[]) и порядок n
{
 
    if(n==2) // если n = 2, то функция возвращает определитель 2-го порядка, путем вычитания побочной диагонали из главной
    {
        double s = (matrix[0][0]*matrix[1][1])-(matrix[1][0]*matrix[0][1]);
        return s;
    }
    else // а если n>2
    {
        double res = 0;
        bool bo = false;
 
        double **A = new double*[n]; // объявляем матрицу n-го порядка
        for(int i=0;i<n;i++) A[i] = new double[n];
 
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                A[i][j]=matrix[i][j]; // "наполняем" матрицу A из ссылки matrix
 
        double **B = new double*[n-1]; // объявляем матрицу (n-1)-го порядка
        for(int i=0;i<(n-1);i++)
            B[i] = new double[n-1];
 
        for(int d=0; d<n; d++) // задаем цикл: эти элементы будем вычеркивать
        {
            for(int j=0; j<n; j++) // задаем цикл: это строки матрицы
            {
                for(int k=0; k<n; k++) // задаем цикл: это столбцы матрицы
                {
                    if(k!=d) // проверяем: не этот столбец мы вычеркнули
                    {
                        if(j!=0) // проверяем: не эту строку мы вычеркнули
                        {
                            if(!bo) B[j-1][k] = A[j][k]; else B[j-1][k-1] = A[j][k]; // проверяем: до или после столбца, который мы вычеркнули
                        }
                    }
                    else bo = true;
                }
            bo = false;
            }
 
            if(((d+2)%2)==0) res += A[0][d]*det_matrix(B,n-1); else res -= A[0][d]*det_matrix(B,n-1); // а теперь знаки; если сумма строк и столбцов вычеркнутого знака четна, то мы складываем произведение выч. цифры с рекуррентным значением этой же функции, но на единицу меньшей матрицы, если нет - то вычитаем.
        }
    }
}
 
// 5 - посчитать ранг матрицы
int calc_rank(double ** matrix, int i, int j)
{
    int r = 0;
    int q = 1;
 
    while(q <= l_min(i,j)) // проверка: порядок матрицы меньше или равен минимальному из размеров матрицы?
    { // если да
        double **B = new double*[q]; // создаем новую матрицу размера q
        for(int w=0; w<q; ++w)
            B[w] = new double[q];
 
        for(int a=0; a<(i-(q-1)); ++a) // тут начинается перебор матриц q-го порядка
        {
            for(int b=0; b<(j-(q-1)); ++b)
            {
                for(int c=0; c<q; ++c)
                    for(int d=0; d<q; ++d)
                        B[c][d] = matrix[a+c][b+d];
 
                if(!(det_matrix(B,q)==0)) // если определитель матрицы отличен от нуля
                { // то
                    r = q; // присваиваем рангу значение q
                }
            }
        }
    q++; // прибавляем 1
    }
    return r;
}
0
12.09.2014, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2014, 17:30

Неправильно считается ранг матрицы
#include &lt;algorithm&gt; #include &lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt;...

Матрицы. Найти ее ранг и средние значения по столбцам (дописать код)
пункт 1. С клавиатуры задается матрица размером 5 * 5. Найти ее ранг и средние...

Определить, что все элементы строки первой матрицы больше соответствующих элементов строки второй матрицы
Помогите,пожалуйста,с решением массивов в с++.надо в статическом и динамическом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru