2016-05-14 4 views
0

Cには新しいので、私は3対角行列を作るための少しのコードを書いた。しかし、この行列は初期化と視覚化の間で変化するので、私は迷っています。 printfを使って "紙のように"の行列を見ると、インデックスiとjが印刷されてそこに問題があるかどうかがチェックされますが、明らかにそうではありません。私はA [2、2]が2から-1にどのように変化するのか理解していません、あなたは私を助けてくれますか? ここで私が持って出力されます:私のコードは次のように見えますが私のマトリックスは、可視化と割り当てで同じではありませんか?

[0][0]: 2.000000 [0][1]: -1.000000 [0][2]: 0.000000 [0][3]: 0.000000 
[1][0]: -1.000000 [1][1]: 2.000000 [1][2]: -1.000000 [1][3]: 0.000000 
[2][0]: 0.000000 [2][1]: -1.000000 [2][2]: 2.000000 [2][3]: -1.000000 
[3][0]: 0.000000 [3][1]: 0.000000 [3][2]: -1.000000 [3][3]: 2.000000 

[0][0]: 0.000000 [0][1]: 0.000000 [0][2]: -1.000000 [0][3]: 2.000000 
[1][0]: 0.000000 [1][1]: 0.000000 [1][2]: -1.000000 [1][3]: 2.000000 
[2][0]: 0.000000 [2][1]: 0.000000 [2][2]: -1.000000 [2][3]: 2.000000 
[3][0]: 0.000000 [3][1]: 0.000000 [3][2]: -1.000000 [3][3]: 2.000000 

は:

float **A; 
int i, j = 0; 
A_row = (float *)malloc(N * sizeof(float));  
A = (float **)malloc(N * sizeof(float *)); 

for (i = 0; i < N; i++){ 
    A[i] = A_row; 
} 

for (i = 0; i < N; i++) { 
    for (j = 0; j < N; j++) { 
     A[i][j] = 0.; 
     if(i == j){A[i][j] = 2.;} 
     else if(i == j-1) {A[i][j]=-1;} 
     else if(i == j+1) {A[i][j]=-1;} 
     printf("[%d][%d]: %f ", i, j, A[i][j]); 
    } 
    printf("\n"); 
} 

//check A 
for (i = 0; i < N; i++) { 
    for (j = 0; j < N; j++) { 
     printf("[%d][%d]: %f ", i, j, A[i][j]); 
    } 
    printf("\n"); 
} 

私はトラブルのために、本当に残念です。

+0

else if(i == j + 1){A [i] [j] = - 1;} 'を書くことは、実際にはコードを実際には読みにくいものにしてしまいます。 –

答えて

0

マトリックス内のすべての行が同じで、最後の行と同じになります。

A[i] = A_row 

は、あなたがそれはあなたがすべての行に対して "同じ空間" を割り当てる有するように、すなわち、各行のNfloat Sを割り当てる

A[i] = malloc(N * sizeof(float)); 

であるべきです。そのスペースの内容を変更すると、実際にはと同じ行であるため、すべての行に同時に影響します()。

+0

本当にありがとうございます、それは本当に私の問題を解決しました。私はまたあなたが提案した論理的な "または"を使って "else if"を変更します。また、説明に感謝します。それは理にかなって、私の間違いを理解するのに役立ちます! :D素敵な週末があります! – Athaliel

関連する問題