由于我的代码易变,我现在专注于3x3矩阵。我从文本文件中读取矩阵并打印到控制台,根据其尺寸生成身份矩阵。
const int m = 3;
const int n = 3;
int ID[m][n] = {};
for (i = 1; i <= n; ++i){
ID[i][i] = 1;
}
由于某种原因,ID(2)[3]被打印为4227276,因此我必须在事后手动将其强制为零。
除了其他基本的行操作(例如根据开头的入口位置交换行)之外,我的代码的主要块还包括以下内容:
float matrix[m][n];
int i,j,k,p,s;
for(s = 1;s <= m;++s){
j = s;
k = j + 1;
p = j;
for(i = n;i >= j;--i){ // makes leading entries 1
ID[j][i] = ID[j][i]/matrix[j][j];
matrix[j][i] = matrix[j][i]/matrix[j][j];
}
for(j = k;j <= m;++j){ //converts to upper triangular
for(i = n;i >= 1;--i){
ID[j][i] = ID[j][i] - matrix[j][i]*matrix[p][i];
matrix[j][i] = matrix[j][i] - matrix[j][i]*matrix[p][i];
}
}
}
for(j = (m-1);j >= 1;--j){ //makes entries above diagonal zero
for(i = n;i > j;--i){
ID[j][i] = ID[j][i] - matrix[j][i]*matrix[i][i];
matrix[j][i] = matrix[j][i] - matrix[j][i]*matrix[i][i];
}
}
基本上,我对恒等矩阵的处理与对matrix [m] [n]的处理一样,就像将其与增强矩阵一样简化为行梯形形式。行操作是很随意的,因为我只是在做任何使矩阵[m] [n]成为恒等矩阵的工作。然后,我只是在其中插入ID [m] [n] ...不确定是否发生什么,但结果是正确的一半。
我意识到我从ID减去的术语可能需要是ID的倍数,但这会使情况更糟。我犯了什么错误?
答案 0 :(得分:0)
在C ++中,n维数组的索引从0到n-1:因此数组a
的第一个元素是a[0]
,第二个元素是a[1]
, ...,第n个元素是a[n-1]
。
使用for
for (i = 1; i <= n; ++i){
ID[i][i] = 1;
}
您将舍弃每一行和每一列的前几个元素,然后访问不属于包含某些未知值的ID
(例如ID[n][n]
)的内存位置。
您必须使用诸如以下的循环来遍历数组
for (i = 0; i < n; ++i){
ID[i][i] = 1;
}
或者如果您愿意
for (i = 1; i <= n; ++i){
ID[i-1][i-1] = 1;
}
但是我发现最后的解决方案很混乱。