高效 - 在 c# 中使用两个向量的对称矩阵乘法

本文关键字:向量 两个 对称 高效 | 更新日期: 2023-09-27 18:35:16

按照以下初始线程,使cMinor中的c-sharp对称矩阵的副本变得高效。

我会对如何使用矩阵的数组实现而不是经典

long s = 0;
List<double> columnVector = new List<double>(N); 
List<double> lineVector = new List<double>(N); 
//- init. vectors and symmetric square matrix m
for (int i=0; i < N; i++)
{
    for(int j=0; j < N; j++){
        s += lineVector[i] * columnVector[j] * m[i,j];
    }
}

感谢您的输入!

高效 - 在 c# 中使用两个向量的对称矩阵乘法

线向量乘以对称矩阵等于矩阵的转置乘以列向量。因此,只需要考虑列向量情况。

最初,y=A*x的第i个元素定义为

y[i] = SUM( A[i,j]*x[j], j=0..N-1 )

但由于A是对称的,因此总和被分成总和,一个在对角线下方,另一个在对角线上方

y[i] = SUM( A[i,j]*x[j], j=0..i-1) + SUM( A[i,j]*x[j], j=i..N-1 )

从另一个帖子中,矩阵索引是

A[i,j] = A[i*N-i*(i+1)/2+j]  // j>=i
A[i,j] = A[j*N-j*(j+1)/2+i]  // j< i

对于N×N对称矩阵A = new double[N*(N+1)/2];

C#代码中,上面的代码是:

int k;
for(int i=0; i<N; i++)
{
    // start sum with zero
    y[i]=0;
    // below diagonal
    k=i;
    for(int j=0; j<=i-1; j++)
    {                    
        y[i]+=A[k]*x[j];
        k+=N-j-1;
    }
    // above diagonal
    k=i*N-i*(i+1)/2+i;
    for(int j=i; j<=N-1; j++)
    {
        y[i]+=A[k]*x[j];
        k++;
    }
}

示例供您尝试:

| -7  -6  -5  -4  -3 | | -2 |   | -5 |
| -6  -2  -1   0   1 | | -1 |   | 21 |
| -5  -1   2   3   4 | |  0 | = | 42 |
| -4   0   3   5   6 | |  1 |   | 55 |
| -3   1   4   6   7 | |  7 |   | 60 |

要获得二次形式,请使用乘法结果向量做一个点积x·A·y = Dot(x,A*y)

你可以用不安全的代码使矩阵乘法非常快。我已经写过关于它的博客。

使矩阵乘法尽可能快很容易:使用一个众所周知的库。大量的表演工作已经进入了这样的图书馆。你无法与之竞争。