Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/56: Рейтинг темы: голосов - 56, средняя оценка - 4.64
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
1

Обратная матрица

17.05.2013, 11:33. Показов 10651. Ответов 10
Метки нет (Все метки)

Блин народ киньте метод. Я уже не знаю почему мой метод не вычисляет(((.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2013, 11:33
Ответы с готовыми решениями:

Обратная матрица
Люди добрые! Прошу у вас помощи, для курсовой осталось сделать последнее задание, нужно найти...

Обратная матрица
Добрый день! Подскажите пожалуйста код нахождения обратной матрицы n на n.

Обратная матрица
Нужно написать обратную матрицу, начал искать определитель, но появилась ошибка и не могу ее...

Обратная матрица
помогите, пожалуйста как найти обратную матрицу?

10
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
17.05.2013, 11:53 2
Покажи свой метод
0
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 11:57  [ТС] 3
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
 public  double[][] MatrixDuplicate(double[][] matrix)
        {
            
            // Предполагается, что матрица не нулевая
            double[][] result = MatrixCreate(matrix.Length, matrix[0].Length);
            for (int i = 0; i < matrix.Length; ++i) // Копирование значений
                for (int j = 0; j < matrix[i].Length; ++j)
                    result[i][j] = matrix[i][j];
            return result;
        }
       public double[][] MatrixDecompose(int rows, int cols)
      {
          double[][] matrix;
           int[] perm;
           int toggle;
  // Разложение LUP Дулитла. Предполагается,
  // что матрица квадратная.
   // для удобства
  double[][] result = MatrixCreate(rows,cols);
  int n = result.Length;
  Print1(result,rows,cols);
  perm = new int[n];
  for (int i = 0; i < n; ++i) { perm[i] = i; }
  toggle = 1;
  for (int j = 0; j < n - 1; ++j) // каждый столбец
  {
    double colMax = Math.Abs(result[j][j]); // Наибольшее значение в столбце j
    int pRow = j;
    for (int i = j + 1; i < n; ++i)
    {
      if (result[i][j] > colMax)
      {
        colMax = result[i][j];
        pRow = i;
      }
    }
    if (pRow != j) // перестановка строк
    {//тут начинается перенумерация столбцов на обратный порядок
      double[] rowPtr = result[pRow];
      result[pRow] = result[j];
      result[j] = rowPtr;
      int tmp = perm[pRow]; // Меняем информацию о перестановке
      perm[pRow] = perm[j];
      perm[j] = tmp;
      toggle = -toggle; // переключатель перестановки строк
    }
    if (Math.Abs(result[j][j]) < 1.0E-20)
      return null;
    for (int i = j + 1; i < n; ++i)
    {
      result[i][j] /= result[j][j];
      for (int k = j + 1; k < n; ++k)
        result[i][k] -= result[i][j] * result[j][k];
    }
  } // основной цикл по столбцу j
  return result;
}
Добавлено через 1 минуту
кароче код вообще фигня полнейшая. он первую строчку как-то целыми числами оставляет. остальные дробные
0
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 11:58  [ТС] 4
Вот весть поект
Вложения
Тип файла: rar моя.rar (149.1 Кб, 135 просмотров)
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
17.05.2013, 12:05 5
http://msdn.microsoft.com/ru-r... 63137.aspx
Смотрите как сделано тут
0
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 12:20  [ТС] 6
блин да Вы издеваетесь? Я оттуда и взял) непашет.
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
17.05.2013, 12:25 7
очень жаль тогда

Добавлено через 1 минуту
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
    static double[][] MatrixInverse(double[][] matrix)
    {
      int n = matrix.Length;
      double[][] result = MatrixDuplicate(matrix);
      int[] perm;
      int toggle;
      double[][] lum = MatrixDecompose(matrix, out perm, out toggle);
      if (lum == null)
        throw new Exception("Unable to compute inverse");
      double[] b = new double[n];
      for (int i = 0; i < n; ++i)
      {
        for (int j = 0; j < n; ++j)
        {
          if (i == perm[j])
            b[j] = 1.0;
          else
            b[j] = 0.0;
        }
        double[] x = HelperSolve(lum, b);
        for (int j = 0; j < n; ++j)
          result[j][i] = x[j];
      }
      return result;
    }
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
    static double[] HelperSolve(double[][] luMatrix,
     double[] b)
    {
      // Решаем luMatrix * x = b
      int n = luMatrix.Length;
      double[] x = new double[n];
      b.CopyTo(x, 0);
      for (int i = 1; i < n; ++i)
      {
        double sum = x[i];
        for (int j = 0; j < i; ++j)
          sum -= luMatrix[i][j] * x[j];
        x[i] = sum;
      }
      x[n - 1] /= luMatrix[n - 1][n - 1];
      for (int i = n - 2; i >= 0; --i)
      {
        double sum = x[i];
        for (int j = i + 1; j < n; ++j)
          sum -= luMatrix[i][j] * x[j];
        x[i] = sum / luMatrix[i][i];
      }
      return x;
    }
1
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 13:46  [ТС] 8
кароче если там разобраться то там надо вообще всё что выше этой темы копировать.

Добавлено через 45 минут
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
        static double[,] One(double[,] hhh )
        { //'единичная матрица
            int h = 2;
            double[,] ggg = new double[h+1, h+1];// еденичная матрица
           
 
 
 
            //   Dim A_edin(k + 1, k + 1) As Double 'затем она перейдёт в обратную
            for (int g = 0; g < h+1 ; g++)
            {
                for (int j = 0; j < h+1 ; j++)
                {
                    if (g == j)
                    { ggg[g, j] = 1; }
                    else
                    { ggg[g, j] = 0; }
                }
            }
 
            //  'единичная матрица
 
            //'обратная матрица
 
 
            double arg=0 ;
            int i1=0;
            //  Dim arg As Double
            //   Dim i1 As Integer
            for (int j = 0; j < h ; )
            {
                for (int i = 0; i < h ; )
                {
                    if (i == j)
                    { j++; i++; }                   
                        arg = hhh[i, j] / hhh[j, j];
                 
                    //   If i = j Then GoTo 50
 
                    for (i1 = 1; i1 < h; )
                    {
                        //  For i1 = 1 To k + 1
                        hhh[i, i1] = hhh[i, i1] - hhh[j, i1] * arg;
                        //          A(i, i1) = A(i, i1) - A(j, i1) * arg
                        ggg[i, i1] = ggg[i, i1] - ggg[j, i1] * arg;
                        i1++;
                    }
                    //        A_edin(i, i1) = A_edin(i, i1) - A_edin(j, i1) * arg
                    //  Next i1
                    i++;
                    j++;
                }
            }
            //    50:         Next i                      Next j
            for (int j = 0; j < h ; )
            {
                for (int i = 0; i < h ; )
                { //  For j = 1 To k + 1
                    //     For i = 1 To k + 1
                    //       Dim arg_2 As Double
                    double arg_2 = 1;
                    if (i == j)
                    {
                        arg_2 = hhh[i, j];
                        for (i1 = 1; i1 < h + 1; )
                        {
                            hhh[i, i1] = hhh[i, i1] / arg_2;
                            ggg[i, i1] = ggg[i, i1] / arg_2;
                            i1++;
 
                        }
                    }
                    i++;
                    j++;
                }
 
 
                /*     If i = j Then
                         arg_2 = A(i, j)
                         For i1 = 1 To k + 1
                             A(i, i1) = A(i, i1) / arg_2 'стала единичной
                             A_edin(i, i1) = A_edin(i, i1) / arg_2 'стала обратной матрице А
                         Next i1
                     End If
 
                 Next i
             Next j
             'обратная матрица
 
     */
 
            }
            return ggg;
        }
ВОт код с СИ переделаный , но нерабочий. Я торопился и не успел сделать(
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
17.05.2013, 13:51 9
В чём сложность запустить работающий код?
0
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 21:56  [ТС] 10
Да тот код невозможно запустить. он обращается к методам написанным выше. В одном из них вообще есть обращение на создание новой матрицы. Поэтому первое время я реально считал, что оно считает всё как надо, но это только обман. На самом деле создаётся просто новая таблица. Если же довести до ума, то он ничего не считает.
А именно МатриксДупликат запрашивает метод создания новой матрицы СреэйтМатрикс. Ну, кароче вообще не вариант(((.

Добавлено через 1 час 56 минут
Кароче ща выложу весть поект с объяснением. 100% рабочий код. 100% простой. 100% лучший. 100% первый подобный код на C#.
0
165 / 104 / 30
Регистрация: 19.01.2013
Сообщений: 822
17.05.2013, 22:27  [ТС] 11
Ловим. Качаем. Выкладываем улучшенную версию. Не скупимся на "+1".
Вложения
Тип файла: rar обратная матрица.rar (53.0 Кб, 722 просмотров)
14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2013, 22:27

Обратная матрица
1 элемент считает а дальше нули(проверял по калькулятору 1 элемент сходиться) вот код using...

обратная матрица
помогите написать опрограмму обратной матрицы!!! плиз!!!! никак не получается

Жордановы исключения-обратная матрица
Вот написала код для нахождения обратной матрицы способом Жордановых исключений. РАБОТАЕТ, но как...

Обратная матрица методом Гаусса, исправить код
Помогите пожалуйста..всю ночь просидел не могу найти ошибку,возвращает NaN- понимаю что идет...

C# Задание на матрицы.умножение, сложение, вычитание, нахождение определителя и обратная матрица.
Написать программу, осуществляющую ввод и обработку целочисленных квадратных матриц по заданной...

Обратная сортировка
Есть БД, нужно реализовать сортировку по имени через кнопку в обратном порядке от Я до А. P.S...


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

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

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