Программа для вычисления определителя матрицы java
Параллельный расчет определителя квадратной матрицы (OpenMP, MPI) и расчет ускорения
Следующее содержание является заключительным домашним заданием моего курса параллельных вычислений, есть недостатки, пожалуйста, сообщите!
1 Цель
Цель этого эксперимента в основном состоит в следующих трех пунктах:
1 、 Осуществить вычисление определителя квадратной матрицы.
2 、 Осуществите параллельное вычисление определителя квадратной матрицы, соответственно, на основе O penMP с MPI 。
3 、 Сравните время работы трех вышеуказанных алгоритмов, метр Рассчитайте ускорение.
2 Экспериментальная дизайн
2. 1 Сгенерировать квадратную матрицу
Для удобства квадратная матрица в этом эксперименте не использует ручной ввод, а использует случайные числа для генерации матричных элементов. Вегетарианский.
я Определяет глобальное изменение квадратной матрицы количество —— i n t p[ 1 00] [ 100] 。 При создании квадратной матрицы , фаланга Порядок N (N <100) по Внешний вход. Затем используйте два слоя “ f o r цикл ” Подойди к фаланге p Левый верхний угол N ×N Единое место Установить задание. Конкретная реализация выглядит следующим образом :
2. 2 Матрица печати
Выведите сгенерированную матрицу, чтобы проверить правильность определителя. Конкретная реализация выглядит следующим образом:
2. 3 Вычислить определитель матрицы
Есть много способов вычислить определитель матрицы. Метод, выбранный в этом эксперименте, следующий: определитель расширяется по строкам. Ряд Формула столбца равна сумме произведения каждого элемента любой строки и соответствующей формулы алгебраического остатка. Алгебраический остаток: A( ij) = ( -1)^(i+j) M( ij). (ij) - нижний индекс. Остаток элемента равен исходному определителю. Зачеркните строку и столбец, в которых расположен элемент. Этот эксперимент занимает первое Метод расширения строки. То есть: разверните детерминант высокого порядка в соответствии с первой строкой и повторяйте поведение расширения до тех пор, пока Порядок 1 . Вышеупомянутый процесс можно выполнить рекурсивно.
2. 3. 1 Рекурсивный код реализации
Согласно изложенной выше теории, мы легко можем получить следующие способы реализации:
2.4 Реализуйте расчет последовательного порта \ OpenMP \ MPI
Мой параллелизм здесь в основном заключен в первом построчном расширении.Конкретная реализация зависит от кода.
Вы можете проверить следующую ссылку: Определитель матрицы в Java
Если вы привязаны к 4x4, самым простым решением было бы просто скопировать формулу.
Для общего NxN проблема значительно сложнее, с различными алгоритмами порядка O(N!) , O(N^3) и т.д.
Ссылки
Связанные вопросы
Этот метод не обязательно работает, так как вам нужно разделить на элемент вашей матрицы, если элемент вашей матрицы равен 0, вы можете получить результат det = NaN.
Если вы знаете, как это сделать математически, тогда примените это знание и напишите код, который будет делать то же самое, что и вы, если бы вам пришлось вычислять определитель вручную (на бумаге). Как сказал вам Игнасио в своем комментарии, пожалуйста, сообщите нам, что вы пробовали, и, может быть, тогда вы получите лучшие ответы. Я с удовольствием отредактирую ответ и помогу вам.
Сгенерируйте все перестановки целых чисел 1..N и для каждой такой последовательности s_1..s_N вычислим произведение значений ячеек M (i, s_i), умноженное на знаковое значение p (s_1..s_i), , который равен 1, если i-s_1 четный, и -1 в противном случае . Суммируйте все эти продукты.
Postscript
Как утверждает полиген, существуют неэффективные алгоритмы, и это O (N!), так как он продолжает пересчитывать общие субпродукты. Но это интуитивно понятное и эффективное пространство, если сделать лениво.
О, а знаковая функция выше неверна: P (s_1..s_i) - +1, если s_i имеет нечетный индекс в последовательности 1..N с s_1..s_ удален и - 1 для четного индекса.
Я могу подтвердить, что предыдущее решение работает для 3x3 и 4x4, но НЕ для 5x5 и т.д. Следуя решению (очень просто), которое работает для любых измерений (также 5x5 или более).
Для тех, кто может прийти к этому вопросу в поисках алгоритма вычисления детерминанта матрицы, обратите внимание, что выше размещенное решение, которое состоит из этого кода:
работает для 3x3 и 4x4, но НЕ для 5x5 и т.д.,
Однако, поскольку вопрос для конкретного для 4x4 я нашел, что алгоритм правильный (по крайней мере, в некоторых случаях я тестировал).
Если вы запустите код выше, вы получите:
определитель: -8 детерминантом является: -142 определитель: NaN
Я знаю, что на этот вопрос ответили, но для любого, кому может понадобиться алгоритм, который может вычислить определитель матрицы с любыми измерениями, это то, что я придумал.
Этот класс использует много разных методов, чтобы сделать матрицу треугольной, а затем вычисляет ее определитель. Может использоваться для матрицы высокого размера, например, 500 х 500 или даже больше. яркая сторона этого класса в том, что вы можете получить результат в BigDecimal, чтобы не было бесконечности, и у вас всегда был точный ответ. Кстати, использование множества различных методов и избежание рекурсии привели к гораздо более быстрому пути с более высокой производительностью ответа. надеюсь, это будет полезно.
И затем этот класс получает матрицу nxn от пользователя или может генерировать случайную матрицу nxn, а затем вычисляет ее определитель. Также показано решение и окончательная треугольная матрица.
Определитель матрицы 2 x 2:
Определитель матрицы 3 x 3:
using namespace std;
// Функция для получения кофактора mat [p] [q] в temp [] []. n является текущим
// размерность мата [] []
void getCofactor( int mat[N][N], int temp[N][N], int p, int q, int n)
// Цикл для каждого элемента матрицы
for ( int row = 0; row < n; row++)
for ( int col = 0; col < n; col++)
// Копирование во временную матрицу только тех элементов
// которые не находятся в данной строке и столбце
if (row != p && col != q)
// Строка заполнена, поэтому увеличиваем индекс строки и
// сбросить индекс col
/ * Рекурсивная функция для нахождения определителя матрицы.
n текущее измерение mat [] []. * /
int determinantOfMatrix( int mat[N][N], int n)
int D = 0; // Инициализировать результат
// Базовый случай: если матрица содержит один элемент
int temp[N][N]; // Для хранения кофакторов
int sign = 1; // Сохранить множитель знака
// Итерация для каждого элемента первой строки
for ( int f = 0; f < n; f++)
// Получение Cofactor of mat [0] [f]
getCofactor(mat, temp, 0, f, n);
D += sign * mat[0][f] * determinantOfMatrix(temp, n - 1);
// условия должны быть добавлены с альтернативным знаком
/ * функция отображения матрицы * /
void display( int mat[N][N], int row, int col)
for ( int i = 0; i < row; i++)
for ( int j = 0; j < col; j++)
printf ( " %d" , mat[i][j]);
// Программа драйвера для проверки вышеуказанных функций
printf ( "Determinant of the matrix is : %d" ,
// Java программа для поиска детерминанта
// матрица
// Размер входной квадратной матрицы
static final int N = 4 ;
// Функция для получения кофактора
// mat [p] [q] in temp [] []. н это
// текущее измерение мата [] []
static void getCofactor( int mat[][],
int temp[][], int p, int q, int n)
// Цикл для каждого элемента
for ( int row = 0 ; row < n; row++)
for ( int col = 0 ; col < n; col++)
// Копирование во временную матрицу
// только те элементы, которые
// не в данной строке и столбце
if (row != p && col != q)
// Строка заполнена, поэтому увеличивается
// индекс строки и сброс кол
/ * Рекурсивная функция для поиска определителя
матрицы. n текущее измерение mat [] []. * /
static int determinantOfMatrix( int mat[][], int n)
int D = 0 ; // Инициализировать результат
// Базовый случай: если матрица содержит один
return mat[ 0 ][ 0 ];
// Для хранения кофакторов
int temp[][] = new int [N][N];
// Сохранить множитель знака
// Итерация для каждого элемента первой строки
for ( int f = 0 ; f < n; f++)
// Получение Cofactor of mat [0] [f]
getCofactor(mat, temp, 0 , f, n);
D += sign * mat[ 0 ][f]
* determinantOfMatrix(temp, n - 1 );
// условия должны быть добавлены с
/ * функция отображения матрицы * /
static void display( int mat[][], int row, int col)
for ( int i = 0 ; i < row; i++)
for ( int j = 0 ; j < col; j++)
public static void main (String[] args)
"of the matrix is : " +
// Этот код предоставлен Anant Agarwal.
// Размер входной квадратной матрицы
static int N = 4;
// Функция для получения кофактора
// mat [p] [q] in temp [] []. н это
// текущее измерение мата [] []
static void getCofactor( int [,]mat,
// Цикл для каждого элемента
for ( int row = 0; row < n; row++)
for ( int col = 0; col < n; col++)
// Копирование во временную матрицу
// только те элементы, которые
// не в данной строке и столбце
if (row != p && col != q)
temp[i, j++] = mat[row, col];
// Строка заполнена, поэтому увеличивается
// индекс строки и сброс кол
/ * Рекурсивная функция для
матрицы. n является текущим
static int determinantOfMatrix( int [,]mat,
int D = 0; // Инициализировать результат
// Базовый случай: если матрица
// Для хранения кофакторов
int [,]temp = new int [N, N];
// Сохранить множитель знака
// Итерация для каждого элемента
for ( int f = 0; f < n; f++)
// Получение Cofactor of mat [0] [f]
getCofactor(mat, temp, 0, f, n);
D += sign * mat[0, f]
* determinantOfMatrix(temp, n - 1);
// условия должны быть добавлены с
/ * функция для отображения
static void display( int [,]mat,
for ( int i = 0; i < row; i++)
for ( int j = 0; j < col; j++)
public static void Main ()
"of the matrix is : " +
// Этот код предоставлен нитин митталь.
Сопряженный и обратный матрицы
Существуют различные свойства детерминанта, которые могут быть полезны для решения проблем, связанных с матрицами,
Эта статья предоставлена Уткаршем Триведи. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
using namespace std;
Определитель (детерминант) квадратной матрицы — это число, которое ставится в соответствие матрице и вычисляется по ее элементам согласно следующим правилам.
Реализация на C++
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 Благодарю, Ваш пример помог мне разобраться в этой теме. Но думаю что создавать и копировать минор матрицы на каждой рекурсии нерационально. Достаточно передавать в рекурсию ссылки на исходную матрицу. Это и короче в написании и экономит память и вычислительное время. 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
// ----------------------------- Определитель --------------------------
// Вычисляет определитель матрицы T размерностью N
double det( double **T, UINT 32 N)
double det__;
int sub_j, s;
double **subT; // Субматрица как набор ссылок на исходную матрицу
switch (N)
case 1:
return T[0][0];
case 2:
return T[0][0] * T[1][1] - T[0][1] * T[1][0];
default:
if (N < 1) return nan( "1" ); // Некорректная матрица
subT = new double *[N-1]; // Массив ссылок на столбцы субматрицы
det__ = 0;
s = 1; // Знак минора
for ( int i = 0; i < N; i++) // Разложение по первому столбцу
sub_j = 0;
for ( int j = 0; j < N; j++) // Заполнение субматрицы ссылками на исходные столбцы
if (i != j) // исключить i строку
subT[sub_j++] = T[j] + 1; // здесь + 1 исключает первый столбец
det__ = det__ + s * T[i][0] * det(subT, N-1);
s = -s;
>;
delete [] subT;
return det__;
>;
>;
Читайте также: