2017-11-07 3 views
0

私はC++が初めてで、forループを使用して行列の列を1に正規化しようとしています。これは私の試みです:与えられた行列をC++で1になる行列に正規化する

#include <iostream> 
#include <string> 

int main() { 
double A[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
double sum = 0; 
int r = 3; 
int c = 3; 
for (int j=0; j < c; j++) { 
    for (int i=0; i < r; i++) { 
    sum += A[i][j]; 
    } 
    for (int i=0; i < r; i++) { 
    A[i][j] /= sum; 
    } 
} 
for (int j=0; j < 3; j++) { 
    for (int i=0; i < 3; i++) { 
     std::cout<<A[i][j]; 
    } 
    std::cout<<std::endl; 
    } 
    return 0; 
} 

そして、これが出力されます:

0.0833333 0.333333 0.583333 
0.0740741 0.185185 0.296296 
0.0666667 0.133333 0.2 

私は出力がそのまま表示される理由はわからない、最初の列のために働いているようですが、ない残り。しかし、残りの2つの列は同じ比率で残ります。どのようにしてコードを修正して、目的のようにforループを使って行列を「正規化」できるのですか?

+0

各列の値を合計し、列の各値をその値で除算する必要がある場合は、 'sum'の値が0から始まるので、最初に機能します。しかし、2番目の列に移動するとき、sumの既存の値、つまり、' sum'の代わりに最初の列の合計があります。次の列。だから、あなたの2番目のforループが終了すると 'A [i] [j]/= sum 'は' sum'に0の値を割り当てます。 –

答えて

1

Suocle、

あなたのコードはほぼあります。あなたが考慮するのを忘れて、物事の一つは、変数sumは全体のマトリックス中に存在していないcolumn

for (int j=0; j < c; j++) { 
    for (int i=0; i < r; i++) { 
    sum += A[i][j]; 
    } 
    for (int i=0; i < r; i++) { 
    A[i][j] /= sum; 
    } 
} 

の値だけの最初の反復のために値を合計、時間をかけてまで続くという事実でありますforループ、すなわち第1列の場合、sumがゼロであるため、列の値の正しい合計が得られ、後で値の合計を除算することによって正規化されます。

しかし、第二列をループの次の反復で、以前sum遺跡の価値ひいてはがcolumn 2の新しい正しい合計を取得するには、ループの終わりに再び0に割り当てる必要がありますか、他あなたはsum=sum(column1)+sum(column2)を持っていますこの段階では。

for (int j=0; j < c; j++) { 
    for (int i=0; i < r; i++) { 
    sum += A[i][j]; 
    } 
    for (int i=0; i < r; i++) { 
    A[i][j] /= sum; 
    } 
    sum = 0; 
} 
+0

@ C.Suocle、あなたの答えがあなたを助けたと感じたら、 http://meta.stackexchange.com/a/5235)。 –

関連する問題