矩阵的行列式怎么求?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵的行列式怎么求?相关的知识,希望对你有一定的参考价值。
可以使用行列式的定义来求矩阵的行列式,行列式的定义是:若矩阵A的元素为 aij,则它的行列式值 D 是:D= a11*a22*a33*...*aan - a12*a21*a33*...*aan + a13*a21*a32*...*aan - ... + (-1)n+1*a1n*a2n*...*aan-1
其中 n 是矩阵 A 的秩。 参考技术A
AB与n阶单位矩阵En构造分块矩阵:
|AB O|
A分乘下面两块矩阵加到上面两块矩阵,有:
|AB A|
|0 En|
右边两块矩阵分乘-B加到左边两块矩阵,有:
|0 A |
|-B En|
所以,r(AB)+n=r(第一个矩阵)=r(最后一个矩阵)>=r(A)+r(B)
即r(A)+r(B)-n<=r(AB)。
解线性方程组
记线性方程组的系数矩阵为A,增广矩阵为B= (A,b),则:
()R(A)= R(B)= n,方程组有惟一解;
(i)R(A)= R(B) < n,方程组有无穷解;
(i)R(A) < R(B),方程组无解。
参考技术B 1、行列式的某一行(列)元素,加上另一行 (列)的元素的k倍, 行列式的值不变。于是 可以第一行加上第二行的1倍。 2、方阵有两行成比例,则行列式专为属0。 第一行和最后一行是相等的(成比例,1: 1),所以行列式的值为0。MPI上求矩阵行列式方法的并行化
【中文标题】MPI上求矩阵行列式方法的并行化【英文标题】:Parallelization of the method for finding the determinant of a matrix on MPI 【发布时间】:2022-01-11 21:43:13 【问题描述】:如何实现并行化在 MPI 上查找矩阵行列式的方法?如何并行化矩阵的填充,是否可以将数据从前一个进程传递到每个进程,以及如何将其应用于我的代码?
double GaussDet(double** mat, int size)
int determinant = 1;
for (int i = 1; i < size; ++i)
for (int k = i; k < size; ++k)
for (int j = size - 1; j >= 0; --j)
mat[k][j] -= mat[k][i - 1] / mat[i - 1][i - 1] * mat[i - 1][j];
for (int i = 0; i < size; i++)
for(int j = 0; j < size; j++)
if(i == j)
determinant *= mat[i][j];
return determinant;
int main(int argc, const char * argv[])
srand(time(NULL));
int N = 4;
double **matrix = malloc(N * sizeof(double*));
for (int i = 0; i < N; i++)
matrix[i] = malloc(N * sizeof(double*));
fill_matrix(matrix, N);
print_matrix(matrix, N);
double det = GaussDet(matrix, N);
print_matrix(matrix, N);
printf("det = %f\n", det);
【问题讨论】:
int determinant = 1;
很奇怪。为什么int
?
避免matrix[i] = malloc(N * sizeof(double*));
中的大小错误。而是将大小设置为引用值:matrix[i] = malloc(N * sizeof matrix[i][0]);
.
"如何将它应用到我的代码中?" --> 我建议先让代码作为一个进程正确运行,然后再尝试多个进程。
所以他做对了。或者如果有错误在哪里?除了记忆,我更正了它
【参考方案1】:
您正在描述通过简化为上三角形式,然后将对角线上的元素相乘来计算行列式。上三角归约是高斯消元(或:计算 LU 分解)的基础,所以让我们假设这就是您所要求的。
好的,所以你有一个矩阵和 MPI。 MPI 使用分布式内存,因此为了实现良好的实现,您需要分发矩阵。最简单的解决方案是让每个进程存储许多不同的行。列也是可能的,但这对论点没有影响。
高斯消元有很多并行性,但它有一个顺序组件:1/a[i,i]
枢轴的计算。您为i
的一个值执行此操作,更新所有矩阵元素,为下一个i
执行此操作,等等。需要注意的重要一点是,只有一个进程存储了该元素,因此只有一个进程知道枢轴的值。因此,该过程必须将其广播给所有其他人。然后每个人都可以更新他们的矩阵元素。
从编码开始:每个进程得到矩阵的一个切片,然后你计算分解。
现在,这个算法有问题:在你消除了 pivot i
之后,存储它的进程不再活动。所以在分解的过程中,你的并行度会越来越少。您可以通过为每个进程提供不是矩阵的块切片,而是通过循环来解决此问题。还有一个更难描述的问题,即将整行分配给进程的基本假设。
因此,这种算法的高质量实现非常罕见。 Scalapack 和 PLapack(都是 1990 年代),然后是 Elemental(2010 年代),实际上几乎只有它们。去显示这个问题是多么棘手。但正如我上面概述的那样,基础应该是可行的。
【讨论】:
好的,谢谢,你能告诉我在哪里可以阅读,例如关于快速排序的并行性吗? 我找到了一个例子,但是效果很差,例如,对于 50-100 个元素,它只是显示错误或具有未知值的数组link 如果你想学习 MPI,你就走错了路。使用 MPI 进行快速排序非常。那你想做什么? (顺便说一句,感谢您支持并接受我的回答。提示。) 你意识到快速排序是一个完全不同的问题? 是的,我明白了。不,我不学习 MPI,但课程项目的分配与之相关。有几个选项,我认为快速排序可能更容易,因为即使代码也在互联网上,但事实证明,它只适用于示例中的数据。我可以创建一个关于她的新问题吗?值得吗?以上是关于矩阵的行列式怎么求?的主要内容,如果未能解决你的问题,请参考以下文章