Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023

Вычисление определителя квадратной матрицы с разложением по первой строке

08.10.2013, 17:35. Показов 3102. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане.

Мне в личку поступил запрос с просьбой подсказать, как можно вычислить определитель квадратной матрицы, используя формулу разложения по первой строке.

Делюсь с вами результатами моих изысканий - максимально простой и понятной рекурсивной функцией для вычисления определителя. Она не является оптимальной в плане быстродействия, зато ее анализ и применение не потребуют от вас больших усилий.

Вычисление определителя
Visual Basic
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
'Ôóíêöèÿ äëÿ èñêëþ÷åíèÿ èç ìàòðèöû arr 1-îé ñòðîêè è j-îãî ñòîëáöà.
'Ðåçóëüòèðóþùàÿ ìàòðèöà èìååò ðàçìåð n x n.
Function Exc1RowJColumn(ByVal arr As Variant, ByVal j As Long, ByVal n As Long) As Variant
    Dim i As Long, jj As Long
    ReDim arr2(1 To n, 1 To n) As Double
    For i = 1 To n
        For jj = 1 To n
            arr2(i, jj) = arr(i + 1, jj + IIf(jj < j, 0, 1))
        Next jj
    Next i
    Exc1RowJColumn = arr2
End Function
'Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ âû÷èñëåíèÿ îïðåäåëèòåëÿ ìàðòèöû arr ðàçìåðîì n x n.
Function Determinant(ByVal arr As Variant, ByVal n As Long) As Double
    Dim j As Long, S As Double
    If n = 1 Then
        Determinant = arr(1, 1) 'Îïðåäåëèòåëü ìàòðèöû ðàçìåðîì 1 x 1 ðàâåí åäèíñòâåííîìó åå ýë-òó.
    Else
        'Âû÷èñëåíèå îïðåäåëèòåëÿ ìàòðèöû n x n ïðè n > 1 ñâîäèòñÿ ê âû÷èñëåíèþ ñóììû ïðîèçâåäåíèé
        'j-îãî ýëåìåíòà ñòðîêè ðàçëîæåíèÿ è îïðåäåëèòåëÿ ìàòðèöû, ïîëó÷åííîé ïóòåì èñêëþ÷åíèÿ èç
        'èñõîäíîé ìàòðèöû âû÷åðêèâàíèåì ñòðîêè ðàçëîæåíèÿ è j-îãî ñòîëáöà. Ñóììà âû÷èñëÿåòñÿ äëÿ
        'j îò 1 äî n. Çíàê ñëàãàåìîãî ðàâåí "+" äëÿ íå÷åòíûõ è "-" äëÿ ÷åòíûõ ñëàãàåìûõ.
        For j = 1 To n
            S = S + (-1) ^ (1 + j) * arr(1, j) * Determinant(Exc1RowJColumn(arr, j, n - 1), n - 1)
        Next j
        Determinant = S
    End If
End Function
'Ïðîâåðêà ôóíêöèè âû÷èñëåíèÿ îïðåäåëèòåëÿ (çàïóñêàòü â Excel).
Sub TestDeterminant()
    Const n = 5
    Dim arr As Variant
    Cells.Clear
    With Cells(1).Resize(n, n)
        .Formula = "=RANDBETWEEN(-10,10)"
        .Value = .Value
        Cells(n + 2, 1).Formula = "=""Îïðåäåëèòåëü, âû÷èñëåííûé ñ ïîìîùüþ âñòðîåííîé ôóíêöèè Excel: ""&MDETERM(" & .Address & ")"
        arr = .Value
    End With
    Cells(n + 4, 1) = "Îïðåäåëèòåëü, âû÷èñëåííûé ñ ïîìîùüþ ôóíêöèè Determinant: " & Determinant(arr, n)
End Sub

С уважением,
Aksima
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2013, 17:35
Ответы с готовыми решениями:

Вычисление определителя и нахождение обратной матрицы методом исключения
Нужна только блок-схема, а то в схемах я пень пнем. Вот код. Function input_error() As Integer ' err – идентификатор...

Вычисление определителя матрицы 4х4 методом разложения по строке
Доброго времени суток. Помогите пожалуйста, нужно решить вот такую задачу с помощью Pascal: &quot;Пользователь задаёт матрицу 4х4....

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

5
128 / 0 / 1
Регистрация: 02.04.2013
Сообщений: 16
11.10.2013, 13:54
Visual Basic
1
2
3
4
5
6
7
8
9
10
Function Exc1RowJColumn(ByVal arr As Variant, ByVal j As Long, ByVal n As Long) As Variant
    Dim i As Long, jj As Long
    ReDim arr2(1 To n, 1 To n) As Double
    For i = 1 To n
        For jj = 1 To n
            arr2(i, jj) = arr(i + 1, jj + IIf(jj < j, 0, 1))
        Next jj
    Next i
    Exc1RowJColumn = arr2
End Function
Как можно упростить этот код, без употребления IIf и ByVal?
0
здесь больше нет...
3376 / 1674 / 184
Регистрация: 03.02.2010
Сообщений: 1,219
11.10.2013, 14:20
Visual Basic
1
jj + IIf(jj < j, 0, 1)

Visual Basic
1
jj + (jj < j) + 1
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
11.10.2013, 16:44  [ТС]
Здравствуйте, PornKingAlex,
Сделал, как вы просили - переписал программу без использования IIf, ByVal.

Кликните здесь для просмотра всего текста
Visual Basic
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
'Ôóíêöèÿ äëÿ èñêëþ÷åíèÿ èç ìàòðèöû arr 1-îé ñòðîêè è j-îãî ñòîëáöà.
'Ðåçóëüòèðóþùàÿ ìàòðèöà èìååò ðàçìåð n x n.
Function Exc1RowJColumn(arr As Variant, j As Long, n As Long) As Variant
    Dim i As Long, jj As Long
    ReDim arr2(1 To n, 1 To n) As Double
    For i = 1 To n
        For jj = 1 To n
            If jj < j Then
                arr2(i, jj) = arr(i + 1, jj)
            Else
                arr2(i, jj) = arr(i + 1, jj + 1)
            End If
        Next jj
    Next i
    Exc1RowJColumn = arr2
End Function
'Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ âû÷èñëåíèÿ îïðåäåëèòåëÿ ìàðòèöû arr ðàçìåðîì n x n.
Function Determinant(arr As Variant, n As Long) As Double
    Dim j As Long, S As Double
    If n = 1 Then
        Determinant = arr(1, 1) 'Îïðåäåëèòåëü ìàòðèöû ðàçìåðîì 1 x 1 ðàâåí åäèíñòâåííîìó åå ýë-òó.
    Else
        'Âû÷èñëåíèå îïðåäåëèòåëÿ ìàòðèöû n x n ïðè n > 1 ñâîäèòñÿ ê âû÷èñëåíèþ ñóììû ïðîèçâåäåíèé
        'j-îãî ýëåìåíòà ñòðîêè ðàçëîæåíèÿ è îïðåäåëèòåëÿ ìàòðèöû, ïîëó÷åííîé ïóòåì èñêëþ÷åíèÿ èç
        'èñõîäíîé ìàòðèöû âû÷åðêèâàíèåì ñòðîêè ðàçëîæåíèÿ è j-îãî ñòîëáöà. Ñóììà âû÷èñëÿåòñÿ äëÿ
        'j îò 1 äî n. Çíàê ñëàãàåìîãî ðàâåí "+" äëÿ íå÷åòíûõ è "-" äëÿ ÷åòíûõ ñëàãàåìûõ.
        For j = 1 To n
            S = S + (-1) ^ (1 + j) * arr(1, j) * Determinant(Exc1RowJColumn(arr, j, n - 1), n - 1)
        Next j
        Determinant = S
    End If
End Function
'Ïðîâåðêà ôóíêöèè âû÷èñëåíèÿ îïðåäåëèòåëÿ (çàïóñêàòü â Excel).
Sub TestDeterminant()
    Dim arr As Variant
    If TypeName(Selection) <> "Range" Then
        MsgBox "Âûäåëèòå â êà÷åñòâå ìàòðèöû äèàïàçîí íà ëèñòå."
        Exit Sub
    End If
    arr = Selection.Value
    If Not IsArray(arr) Then
        MsgBox "Îïðåäåëèòåëü âûäåëåííîé ìàòðèöû ðàâåí:   " & arr
        Exit Sub
    End If
    If UBound(arr) <> UBound(arr, 2) Then
        MsgBox "Âûäåëåííàÿ ìàòðèöà äîëæíà áûòü êâàäðàòíîé."
        Exit Sub
    End If
    MsgBox "Îïðåäåëèòåëü âûäåëåííîé ìàòðèöû ðàâåí:   " & Determinant(arr, UBound(arr))
End Sub

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

Этот трюк основан на неявном преобразовании типов в VBA и заключается в следующем:
  1. Вычисляется значение выражения jj < j. Оно либо истинно (True), либо ложно (False)
  2. Поскольку далее это выражение участвует в арифметической операции, то интерпретатор VBA неявныем образом преобразует его к типу Long. True преобразуется в -1, а False - в 0.
  3. Результат преобразования складывается с единицей, и получаем следующее:
    • если jj < j истинно (True), то результат всего выражения (jj < j) + 1 равен 0.
    • если jj < j ложно (False), то результат всего выражения (jj < j) + 1 равен 1.
Отсюда следует, что (jj < j) + 1 и вправду экивалентно IIf(jj < j, 0, 1). Не правда ли, здорово?

С уважением,
Aksima
3
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
22.12.2014, 08:36
Цитата Сообщение от аналитика Посмотреть сообщение
Visual Basic
1
jj + IIf(jj < j, 0, 1)
Visual Basic
1
jj + (jj < j) + 1
Visual Basic
1
jj-(j<=jj)
1
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
27.03.2016, 18:56
(не там)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2016, 18:56
Помогаю со студенческими работами здесь

Модуль определителя произвольной квадратной матрицы
unit sur; interface type Tmatr=array of real; var a:Tmatr; det:real; i,j,n:integer; procedure Per(k,n:integer;var...

Алгоритм вычисления определителя квадратной матрицы
Помогите с алгоритмом вычисления определителя матрицы nxn. Может у кого-то уже есть код на с++. Заранее благодарю.......

Нахождение определителя квадратной матрицы (готовое решение)
Всем привет!Я искал способ написания кода для нахождения определителя квадратной матрицы. На форуме выкладывалась библиотека, в которой...

Расчёт определителя квадратной матрицы произвольного размера
Написать программу расчёта определителя случайно сгенерированной квадратной матрицы произвольной размерности (воспользоваться методом...

Рекурсивная функция вычисления определителя квадратной матрицы
Написать рекурсивную функцию вычисления определителя квадратной матрицы (использовать разложение по строке/столбцу).


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru