C ++减少矩阵的维度
c++ reduce the dimensions of a matrix
我遇到了以下问题:我有一个 9x9 矩阵,我想将其缩减为 5x5 矩阵。我想通过取消最后 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);
您需要为跳过的行和列调整索引
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);
例如,当 A
是 4
时,您想要写入索引 3
而此代码有效,因为 A>2
是 true
并且将是在进行数学运算时隐式转换为 1
(false
被转换为 0
,从而使索引 0
和 1
保持不变)。
明确说明您要实现的内容总是明智的,因此它应该易于阅读。
在此示例中,您应该定义要跳过的行和列:
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];
[更新]
也可以通过定义目标->源索引以更快的方式完成:
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]];
顺便说一句 - 你的范围 [0,6)
是 length == 6
- 你应该使用 [0,5)
范围来满足 5x5
矩阵
我遇到了以下问题:我有一个 9x9 矩阵,我想将其缩减为 5x5 矩阵。我想通过取消最后 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);
您需要为跳过的行和列调整索引
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);
例如,当 A
是 4
时,您想要写入索引 3
而此代码有效,因为 A>2
是 true
并且将是在进行数学运算时隐式转换为 1
(false
被转换为 0
,从而使索引 0
和 1
保持不变)。
明确说明您要实现的内容总是明智的,因此它应该易于阅读。
在此示例中,您应该定义要跳过的行和列:
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];
[更新]
也可以通过定义目标->源索引以更快的方式完成:
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]];
顺便说一句 - 你的范围 [0,6)
是 length == 6
- 你应该使用 [0,5)
范围来满足 5x5
矩阵