Ошибка умножения в матрицах, если я делаю это в цикле
Это моя функция
void clear_up(MatrixXd A, int dim) //to set all initial values of the matrix to 0 { for(int i=0;i<dim;i++) { for(int j=0;j<dim;j++) { A(i,j)=0; } } } int sumrow(MatrixXd A,int row, int dim) //adding up elements of a particular row { int sum=0; for(int i=0;i<dim;i++) { sum=sum+A(row,i); } return sum; } MatrixXd generate_B(MatrixXd A, int dim) //A is a symmetric matrix with diagonal elements 0 and other elements either 0 or 1 { cout<<"A \n"<<A<<"\n"; MatrixXd B(dim,dim), inter1(dim,dim), inter2(dim,dim), D(dim,dim); clear_up(B,dim); clear_up(inter1,dim); clear_up(inter2,dim); clear_up(D,dim); for(int i=0;i<dim;i++) { for(int j=0;j<dim;j++) { if(i==j) { D(i,j)= 1/sqrt(sumrow(A,i,dim)); //D is thus a diagonal matrix } else { D(i,j) = 0; } } } cout<<"D \n"<<D<<"\n"; for(int a=0;a<dim;a++) { for(int b=0;b<dim;b++) { for(int c=0;c<dim;c++) { inter1(a,b)+= A(a,c)*D(c,b); //inter1 = A*D } } } cout<<"inter1 \n"<<inter1<<"\n"; for(int x=0;x<dim;x++) { for(int y=0;y<dim;y++) { for(int z=0;z<dim;z++) { inter2(x,y)+= D(x,z)*inter1(z,y); //inter2 = D*A*D } } } cout<<"inter2 \n"<<inter2<<"\n"; for(int X=0; X<dim; X++) { for(int Y=0; Y<dim; Y++) { if(X==Y) { B(X,Y) = 1 - inter2(X,Y); } else { B(X,Y) = 0 - inter2(X,Y); } } //B = I - D*A*D (I = identity matrix) } cout<<"B \n"<<B<<"\n"; clear_up(inter1,dim); clear_up(inter2,dim); clear_up(D,dim); return B; }
A-симметричная матрица с диагональными элементами 0 и недиагональными элементами 0 или 1. математически B должна быть симметричной матрицей с диагональными элементами 1, что и происходит за 1 итерацию. Однако, когда я запускаю его в цикле, некоторые матрицы симметричны, а некоторые нет. В чем может быть причина?
Что я уже пробовал:
Попробовал разбить его на разные функции. Также попробовал очистить ненужные значения.
ZurdoDev
Отладьте свой код и выясните, что не так.