次の問題があります。行列nxn(マルチ配列A [n] [n])とベクトルb [i]があり、これら2つの配列間で行から列への積を計算し、新しい配列を生成します。 c[i]。
コードの最初の部分は正しく機能します。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void){
double A[4][4]={{0,0,1,0.5},{0.33,0,0,0},{0.33,0.5,0,0.5},{0.33,0.5,0,0}};
double b[4]={0.25,0.25,0.25,0.25};
double c[4]={0.,0.,0.,0.};
int n,i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[i] += A[i][j]*b[j];
}
}
for(i=0;i<4;i++){
printf("c[%d]=%lf\n",i,c[i]);
}
printf("\n");
}
このようにして、次のような4次元のベクトルを取得します。
c[0]=0.375
c[1]=0.082
c[2]=0.332
c[3]=0.207
ここで問題となるのは、ベクトルb[i]のコンポーネントとベクトルc[i]のコンポーネントの差が最大0.001になるまで、プログラムを繰り返したいということです。反復を行うために、do / whileを作成しようと思いましたが、反復を行う方法がわかりません。私がやろうと思ったことを示します:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void){
double A[4][4]={{0,0,1,0.5},{0.33,0,0,0},{0.33,0.5,0,0.5},{0.33,0.5,0,0}};
double b[4]={0.25,0.25,0.25,0.25};
double c[4]={0.,0.,0.,0.};
int n,i,j;
do{
b[i]==c[i]; /* new add, but i don t know if it is the right place to put it..*/
for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[i] += A[i][j]*b[j];
}
}
}while(abs(b[i]-c[i])<0.001); /*the condition into the while should be correct*/
for(i=0;i<4;i++){
printf("c[%d]=%lf\n",i,c[i]);
}
printf("\n");
}
結果は次のようになります。
c[0]=0.38
c[1]=0.12
c[2]=0.29
c[3]=0.19
しかし、そうではありません...どうすればよいですか?