c ++减少矩阵的尺寸

时间:2015-08-03 12:41:58

标签: c++ matrix dimensions

我遇到了以下问题:我得到了一个9x9矩阵,我希望将其缩小为5x5矩阵。我希望通过取消最后3行和列以及取消第3行和第3列来实现此目的。 我的代码看起来像这样。但它无法正常工作。

for (int A=0;A<6;A++)
  for (int B=0;B<6;B++)
      if ((A!=2) || (B!=2))
          disshess5x5(A,B) = disshessian(A,B);

2 个答案:

答案 0 :(得分:0)

您需要调整跳过的行和col

的索引
for (int A=0;A<6;A++)
  for (int B=0;B<6;B++)
      if ((A!=2) && (B!=2))
          disshess5x5(A-(A>2),B-(B>2)) = disshessian(A,B);

例如当A4时,您想要写入索引3而此代码有效,因为A>2true并且将转换为在进行数学运算时隐含1false而是转换为0,从而使索引01保持不变。

答案 1 :(得分:0)

明确你要实现的内容总是明智的,所以它应该易于阅读。

在此示例中,您应该定义要跳过的行和列:

const bool rowToSkip[9] = { false, false, true, false, false, false, true, true, true, true };
const bool colToSkip[9] {...};

如前所述,您还应该定义源到目标索引映射:

const int tgtRow[9] = {0,1,2,-1,3,4}; // and in the same way tgtCol

通过这样的功能,您将获得干净的循环,轻松发现任何错误:

for(int i = 0; i < 9; ++i)
 if(!rowToSkip[i])
     for (int j = 0; j < 9; ++j)
       if(!colToSkip[j])
         tgtMatrix[tgtRow[i]][tgtCol[j]] = srcMatrix[i][j];

<强> [UPDATE]

只需定义target-&gt;源索引,也可以通过更快的方式完成:

const int srcRow[5] = {0,1,3,4,5};
const int srcCol[5] = {0,1,3,4,5};

for(int i = 0; i < 5; ++i) 
     for (int j = 0; j < 5; ++j)
         tgtMatrix[i][j] = srcMatrix[srcRow[i]][srcCol[j]];

BTW - 您的范围[0,6)属于length == 6 - 您应该使用[0,5)范围来满足5x5矩阵