[英]Make efficient - A symmetric matrix multiplication with two vectors in c#
按照初始線程,從 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];
}
}
感謝您的輸入 !
線向量乘以對稱矩陣等於矩陣乘以列向量的轉置。 所以只需要考慮列向量的情況。
最初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)
進行點積
您可以使用不安全的代碼使矩陣乘法非常快。 我已經寫了關於它的博客。
盡可能快地進行矩陣乘法很容易:使用眾所周知的庫。 瘋狂的性能工作已經投入到這些庫中。 你無法與之競爭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.