我正在尝试解决以下问题。假设我有一个大小为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) ]
我想找到一个函数,它接收两个整数i
和j
作为输入,并输出矩阵的相应值。问题是我不想直接访问矩阵,而是想访问矢量。
这是我迄今为止的推理。如果我有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;
但是,此代码失败。我想我接近解决方案,但我错过了一些东西。有什么帮助吗?
答案 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];
}
}