我正在尝试构建以下14 * 14阵列i C:[I 0; 0 -I],即左上角的7 * 7单位矩阵,减去右下角的标识,否则为零。
这是方法:
#define DIM 7
double S[2*DIM][2*DIM];
for(i = 0; i < DIM; i++){
for(j = 0; j < DIM; j++){
if(i == j){
S[i][j] = 1.0;
S[i+7][j+7] = -1.0;
}
else{
S[i][j] = 0.0;
}
}
}
这适用于所有对角元素;但是,数组的某些元素被初始化为疯狂的值;例如,13,6
被初始化为
68111186113812079535019899599437200576833320031036694798491976301968333351950125611739840800974137748034248687763243996679617222196278187875968953700681881752083957666277350377710107236511681624408064.000000
这似乎一直(至少三次)发生在条目11,13
,12,9
,12,10
,13,12
和13,6
上。
有人可以告诉我这里有什么用,或提供替代解决方案吗?
干杯!
编辑:奇怪的条目不一致。
EDIT2:错字:13,12
,而不是13,15
答案 0 :(得分:4)
您的循环仅覆盖左上象限,因此其他象限中的非对角线元素未初始化并包含垃圾。对于每个维度,你的循环应该上升到2*DIM
,这样对角线元素就会归零,然后对角元素的条件应该稍微复杂一些,以决定将对角线元素设置为哪个值
注意[13,15]完全在这个数组之外!
答案 1 :(得分:4)
您可以用零初始化整个数组,然后只设置对角线
double S[2*DIM][2*DIM] = {0};
for (i = 0; i < DIM; i++) {
s[i][i] = 1;
s[i + DIM][i + DIM] = -1;
}
答案 2 :(得分:2)
您永远不会为s[i][j]
和i != j
或i >= DIM
写信j >= DIM
。如果您的阵列具有自动存储(“本地”),则它包含任意初始值。
答案 3 :(得分:1)
我想说除非i == j(对角线元素),否则大多数7x7以外的元素都不会被初始化。
您想将它们初始化为什么?
答案 4 :(得分:1)
那是因为你没有初始化这些元素。这是一些更好的代码:
#define DIM 14
double S[DIM][DIM];
for (i = 0; i < DIM; i++) {
for (j = 0; j < DIM; j++) {
if (i == j) {
if (i < 7) {
S[i][j] = 1.0;
} else {
S[i][j] = -1.0;
}
} else {
S[i][j] = 0.0;
}
}
}
答案 5 :(得分:0)
您永远不会在DIM + 1和2 * DIM之间使用i或j初始化值。因此,当您查看存储在其中一个位置的值时,您会看到在矩阵访问该空间之前存在的任何内容。