首先,我的建议是利用矢量操作包,因为它会使你的程序更清洁,其次,由于浮点错误,不推荐使用正常的Gram-Schmidt方法进行数值评估(参考文献1)。 维基百科 )。
void gramSchmidt() { double a[3][3] = { {1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}, {1.0, 1.0, 2.0} }; double Result[3][3]; double u1[3],u2[3],u3[3],v1[3],v2[3],v3[3]; for (int i =0; i<3; i++) // Set Result Array to 0 and set the values for u vectors for(int j= 0; j<3; j++) { Result[i][j] = 0.0; if (i == 0) { u1[j] = a[i][j]; } else if (i == 1) { u2[j] = a[i][j]; // std::cout << "u2:" << j << u2[j] << '\n'; } else if (i == 2) { u3[j] = a[i][j]; } } // Solve v1 for (int i=0; i < 3; i++) { v1[i] = u1[i]; } // Solve v2 for (int i=0; i< 3; i++) { v2[i] = u2[i] - func(u2,v1)*v1[i]; } // Solve v3 for (int i=0; i<3; i++) { v3[i] = u3[i] - func(u3, v1)*v1[i] - func(u3, v2)*v2[i]; } // Normalise 3 vectors and store to Results for (int i=0; i<3; i++) Result[0][i] = v1[i]*(1/normalise3d(v1)); for (int i=0; i<3; i++) { Result[1][i] = v2[i]*(1/normalise3d(v2)); } for (int i=0; i<3; i++) { Result[2][i] = v3[i]*(1/normalise3d(v3)); } for (int i = 0; i<3; i++) { std::cout << '\n'; for(int j = 0; j<3; j++) std::cout << Result[i][j] << ' '; } return; } double normalise3d (double a[3]) { double normal = 0.0; for (int i = 0; i< 3; i++) normal+= a[i]*a[i]; normal = sqrt(normal); return normal; } double func (double a[3], double b[3]) // To solve proj(w) { double ans = 0.0; double norm = normalise3d(b); double vecProduct = 0.0; for (int i= 0; i < 3; i++) vecProduct += a[i] * b[i]; ans = vecProduct/(norm * norm); std::cout << "ans: " << ans << '\n'; return ans; }