矩阵的行列式怎么求?

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|

|O En|

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,但课程项目的分配与之相关。有几个选项,我认为快速排序可能更容易,因为即使代码也在互联网上,但事实证明,它只适用于示例中的数据。我可以创建一个关于她的新问题吗?值得吗?

以上是关于矩阵的行列式怎么求?的主要内容,如果未能解决你的问题,请参考以下文章

矩阵怎么求行列式

初等矩阵的行列式怎么求?

eigen怎么表示矩阵的行列式

如何用c语言来求一个四阶行列式的值

怎么理解海森矩阵和雅可比矩阵

LaTeX怎么输入行列较多的矩阵