对称矩阵,将值转换为c ++向量

时间:2018-02-19 14:12:50

标签: c++ matrix

我正在尝试解决以下问题。假设我有一个大小为n的对称矩阵。我想采取所有“重要值”,并将它们存储到矢量中。让我举一个例子来更好地解释它。

假设我有以下矩阵A = [1, 2, 3 // 2, 5, 6 // 3, 6, 9]。我想定义大小为n*(n+1)/2的向量,以便:

V = [A(0,0), A(0,1), A(0,2), A(1,1), A(1,2), A(2,2) ] 

我想找到一个函数,它接收两个整数ij作为输入,并输出矩阵的相应值。问题是我不想直接访问矩阵,而是想访问矢量。

这是我迄今为止的推理。如果我有j < i的输入,我只是交换它们,因为矩阵是对称的。如果我有i == 0,则数组中的位置只是j。如果不是这样,我想我需要做这样的事情。 (n是矩阵的维数,position是数组时所需的整数。)

int position = 0;
for(int k = 0; k < i; k++){
   position = position + (n-k);
}
position = position + j % i;

但是,此代码失败。我想我接近解决方案,但我错过了一些东西。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

最后j % i应为j - i

此外,循环基本上正在进行

position = n + (n - 1) + ... + (n - i + 1);

可以简化为

position = (n * 2 - i + 1) * i / 2;

所以你可以简单地写

position = (n * 2 - i + 1) * i / 2 + j - i;

position = (n * 2 - i - 1) * i / 2 + j;

答案 1 :(得分:0)

你可以这样做:

int myvector[matrix.size()];
int pos = 0;

for(int i = 0; i < matrix.size(); i++){
     for(int j = 0; j < matrix.size(); j++){
        if(j > i) myvector[pos++] = matrix[i][j];
        else myvector[pos++] = matrix[j][i];
     }
 }