2019年7月5日 星期五

Gram-Schmidt process 葛蘭-史密特正交程序

我只把主要的部份留在這邊,剩下要怎麼輸入輸出就留給需要的人自己定義吧~
這邊只有得出正交基底{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;
        }       
    }

沒有留言:

張貼留言