如何减少对称矩阵的计算时间?

计算科学 矩阵 复杂
2021-12-20 00:58:31

我们都知道在模拟具有大矩阵的系统时计算时间会爆炸的问题。我遇到了这个问题,但我的优势是我知道我的矩阵是对称的。

我的问题是:

如果我知道我的矩阵是对称的,你知道减少计算时间的方法吗?

我特别想要的是以下两件事:

  • 仅使用相关条目的对称矩阵的表示
  • 一种算法,可让我在此表示中有效地将两个矩阵相乘
2个回答

显然,如果您的矩阵是稀疏的,您应该转向稀疏矩阵实现。也有一些利用对称性的软件包。

贮存:

假设您的矩阵是密集的,除非您的矩阵具有更详细(已知)的结构,否则您将无法做得比仅存储下(或上)三角形部分节省的 2 倍更好。根据您使用的语言,您可以使用一个简单的指针数组来执行此操作,这些指针指向代表每行第一部分的向量。例如,在 C 中,您可以创建如下表示:

unsigned int i=0; //loop index
unsigned int n=5; //matrix size, nxn
float *M[n]; //array of pointers to floats

for (i=1; i<=n; i++) {
    M[i] = malloc( i * sizeof(float) );
};

这种(和其他)稀疏表示的主要缺点是增加了对数组中任意元素的访问时间。只有您可以说存储和访问时间之间的权衡对于您的应用程序是否值得。在存储矩阵的下三角部分的情况下,如果要访问,则M[i][j]需要先检查是否j<=i. 您可以使用辅助功能,例如

float Mval(M,i,j) {
    if (j<=i) {
        return M[i][j];
    }
    else {
        return M[j][i];
    };
};

矩阵乘法:

不幸的是,乘以对称矩阵的结果不是对称的,除非矩阵在乘法下可以交换。这意味着您必须像往常一样执行完整的矩阵-矩阵乘法,并且您的结果将不是对称的。

如果您对近似结果感到满意,或者您对矩阵的结构有更多了解,您可能会做得更好。您可以搜索随机线性代数来寻找一种可能的近似选项。

如果您使用的是 LAPACK 之类的库,我想您会发现除了那些适用于完全通用输入的例程之外,还有对称矩阵的特定例程。这些旨在提高效率(在时间和/或存储方面)。