gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:33:35 24 4
gpt4 key购买 nike

根据初始线程 make efficient the copy of symmetric matrix in c-sharp来自 cMinor。

我会对如何通过使用矩阵的数组实现而不是经典矩阵来构建具有一个线向量和一个列向量的对称方矩阵乘法的一些输入非常感兴趣

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)

关于c# - Make efficient - 在 c# 中使用两个向量的对称矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com