【问题标题】:Symmetric matrix, value into c++ vector对称矩阵,值转换为 c++ 向量
【发布时间】:2018-02-19 14:12:49
【问题描述】:

我正在尝试解决以下问题。假设我有一个大小为 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;

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

【问题讨论】:

  • 您要解决的实际问题是什么?你有一个三角矩阵(因为它是对称的),你只想存储一半?这是一个众所周知的问题,例如 existing matrix storage schemes,例如 packed storage
  • 是的!类似的东西,虽然我想逐行而不是逐列存储值。我会仔细研究你的链接!

标签: c++ matrix


【解决方案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;

【讨论】:

    【解决方案2】:

    你可以这样做:

    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];
         }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-10
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多