Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c中对称矩阵的有效复制#_C#_Loops_Matrix - Fatal编程技术网

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