C# c中对称矩阵的有效复制#
我想在数组中存储一个对称矩阵 对于一个矩阵,我是这样做的C# c中对称矩阵的有效复制#,c#,loops,matrix,C#,Loops,Matrix,我想在数组中存储一个对称矩阵 对于一个矩阵,我是这样做的 double[,] mat = new double[size,size]; for (int i = 0; i < size; i++) { for (int j = 0; j <= i; j++) mat[i, j] = mat[j, i] = (n * other_matrix[i,j]); } 而不是 double[,] mat 最有效的方法是什么
double[,] mat = new double[size,size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j <= i; j++)
mat[i, j] = mat[j, i] = (n * other_matrix[i,j]);
}
而不是
double[,] mat
最有效的方法是什么
使用
mat[i*n+j]
?如果n是方阵的大小,则对称矩阵需要n*(n+1)/2个总值。这是1+2+3+的和。。。(n-2)+(n-1)+n
不过,需要注意的是,总是试图为给定的行和列计算正确的索引将是一件非常痛苦的事情,如果矩阵将非常大,并且内存将成为一个问题,我只会离开更直观的2D数组。是的
按行存储元素,其中i
-th行和j
-th列存储在索引k=i*NC+j
中,列数为NC
。这适用于非对称一般矩阵
要存储大小为
N
的对称矩阵,您只需要数组中的N*(N+1)/2个元素。你可以假设关于所选答案,i,除非我是个十足的白痴,否则代码是不正确的:
试试这个:
i = 2, j = 1
therefore we use:
k(i,j) = j*N-j*(j-1)/2+i
to find the index k, solving:
k(i,j) = 1*5 - 1*(1-1)/2 + 2
k(i,j) = 5 - 0 + 2 = 7
从选定答案中的矩阵中,我们看到(2,1)不是7,它似乎是6。事实上(因为这似乎是0-base),7出现在(3,1)或(1,3)处。i>j的第二个公式似乎不准确,除非我遗漏了什么
更新:
如果将i>j公式更改为:
k(i,j) = j*(N-1)-j*(j-1)/2+i
那么它正确吗mat[i*n+j]=mat[j*n+i]=(n*其他_矩阵[i,j])代码>嗯。。。某种程度上。它是这样的:if(iN*(N+1)/2
。查看@ja72:你完全正确。我会更新我的答案。我把它写在纸上(我用手重新推导),但写错了。很抱歉哪一个是问题?内存或cpu性能?我还不能写评论-大小限制是什么?@Saeed Amiri performance正常操作(将所有数据保存在RAM中)就足够了。如果矩阵稀疏,你需要一个spart矩阵工具。如果你能给我你关于矩阵乘法的反馈,我会很感兴趣@谢谢。选择的答案似乎在这之后被更正了。
i = 0 .. N-1
j = 0 .. N-1
| 0 1 2 3 4 |
| |
| 1 5 6 7 8 |
| |
| 2 6 9 10 11 |
| |
| 3 7 10 12 13 |
| |
| 4 8 11 13 14 |
i(k) = (int)Math.Floor(N+0.5-Math.Sqrt(N*(N+1)-2*k+0.25))
j(k) = k + i*(i+1)/2-N*i
i = 2, j = 1
therefore we use:
k(i,j) = j*N-j*(j-1)/2+i
to find the index k, solving:
k(i,j) = 1*5 - 1*(1-1)/2 + 2
k(i,j) = 5 - 0 + 2 = 7
k(i,j) = j*(N-1)-j*(j-1)/2+i