提高效率 - 在c#中使用两个向量进行对称矩阵乘法

时间:2012-05-23 11:17:30

标签: c# performance vector matrix matrix-multiplication

按照cMinor的初始线程make efficient the copy of symmetric matrix in 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];
    }
}

感谢您的投入!

3 个答案:

答案 0 :(得分:5)

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

最初i的{​​{1}}元素定义为

y=A*x

但由于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 | | 10 | | -6 -2 -1 0 1 | | -1 | | 16 | | -5 -1 2 3 4 | | 0 | = | 22 | | -4 0 3 5 6 | | 1 | | 25 | | -3 1 4 6 7 | | 7 | | 25 |

执行点积

答案 1 :(得分:3)

你可以使用不安全的代码快速进行矩阵乘法。我有blogged about it

答案 2 :(得分:0)

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