我只把主要的部份留在這邊,剩下要怎麼輸入輸出就留給需要的人自己定義吧~
這邊只有得出正交基底{v1, v2, v3},名字取得一點也不專業,隨便拉~
u_vectors 是基底。
v_vectors 是正交基底。
tmp_vectors 是暫存正交基底所需要減掉的值。
void orthogonal_projection() {
//內積計算
v_vectors[0] = u_vectors[0]; //第一個v1 = u1
cout << endl << endl;
for (int i = 1; i < nos; i++) {
proj_wi_ui(i);
for(int j = 0; j < i; j++){
for(int k = 0; k < noVs; k++){
v_vectors[i][k] = u_vectors[i][k] - tmp_vectors[j][k];
}
}
}
}
void proj_wi_ui(int ui_index) {
double denominator = 0;
double inner_p = 0;
//內積
int i = 0, j;
cout << endl;
for (i; i < ui_index; i++) { // Vi
for (j = 0; j < noVs; j++) { // Vi {1, 2, 3, 4 ...n} ex. 1 2 3 ... n
inner_p += (u_vectors[ui_index][j] * v_vectors[i][j]); //內積 <Ui * V1>
denominator += pow(v_vectors[i][j], 2); // || Vi ^2 ||
}
for (int c = 0; c < noVs; c++) {
tmp_vectors[i][c] += (inner_p / denominator) * u_vectors[i][c];
}
denominator = inner_p = 0;
}
}
沒有留言:
張貼留言