Замыкание матрицы NX 3 и извлечение матрицы уникальных элементов - PullRequest
0 голосов
/ 26 января 2020

У меня проблема с 2D матрицей, состоящей из 3 столбцов и N строк. Теперь я хотел отсортировать матрицу таким образом, чтобы наименьшая из первой строки была первым элементом, и так далее. Первый элемент второго ряда - это наименьшее число с наименьшим значением первого ряда. и похоже на 3-й ряд. Например,

A    B   C
5   2    6
6   5    8
2   9    4
4   5    8
2   3    5
2   9    2

, поэтому отсортированная матрица будет

A   B   C
2   3   5
2   9   2
2   9   4
4   5   8
5   2   6
6   5   8

. Также будет храниться их индекс, такой что

A_i  B_i  C_i

5     5    5 
6     6    6
3     3    3

и т. Д. ...

Я реализовал это с помощью C ++, который неэффективен в вычислительном отношении и занимает очень много времени для очень большой матрицы. Как я могу реализовать это эффективным и быстрым в вычислительном отношении способом?

Мой текущий код C ++ для того же кода выглядит следующим образом

for(int tii=0; tii<f_sizee; tii++){
    track_index(tii)=tii+1;
    }

    for(int chkhk=0;chkhk<f_sizee;chkhk++){
        if(check_index(chkhk)==1){
            for(int chkhk1=chkhk+1;chkhk1<f_sizee;chkhk1++){
                 if((Va_mat(chkhk,0)==Va_mat(chkhk1,0))&&(Va_mat(chkhk,1)==Va_mat(chkhk1,1))&&(Va_mat(chkhk,2)==Va_mat(chkhk1,2))){
                     check_index(chkhk1)=0;
                     track_index(chkhk1)=seed_ind;
                    }
                    else track_index(chkhk)=seed_ind;
                }
                seed_ind=seed_ind+1;
            }
    }

    int new_dim=sum(check_index);
    int new_count=0;
    mat unsort_vmat=zeros(new_dim,Va_mat.n_cols);

    for(int iij=0; iij<f_sizee; iij++){
        if(check_index(iij)==1){
            unsort_vmat.row(new_count)=Va_mat.row(iij);
            new_count++;
        }
    }

    mat sort_vmat=zeros(new_dim,Va_mat.n_cols);
    uvec indices = stable_sort_index(unsort_vmat.col(0));
    int contrrS=0;
    for(int sort_f=0; sort_f < new_dim; sort_f++){
            for(uword sort_f2=0; sort_f2 < Va_mat.n_cols; sort_f2++){
                contrrS=indices(sort_f);
                sort_vmat(sort_f,sort_f2)=unsort_vmat(contrrS,sort_f2);
            }
    }

    mat sort_vmat2 = zeros(new_dim,Va_mat.n_cols);
    sort_vmat2 = sort_vmat ;
    double element_tmp=0;

    for(int iitr=0; iitr < new_dim; iitr++){
        for(int iitk=iitr; iitk < new_dim; iitk++){
            if(sort_vmat(iitk,0)==sort_vmat(iitr,0)){
                if(sort_vmat(iitk,1)>sort_vmat(iitr,1)){///if error, delete this brace
                    element_tmp=sort_vmat(iitr,1);
                    sort_vmat(iitr,1)=sort_vmat(iitk,1);
                    sort_vmat(iitk,1)=element_tmp;
                }
            }
        }
    }
    vec new_ind=zeros(f_sizee);
    int start_ind=0;
    for(int new_index=0; new_index<f_sizee; new_index++){
        new_ind(new_index)=start_ind;
        start_ind++;
    }
    int itr_count=0;
    for(uword itr1=0; itr1<Va_mat.n_rows; itr1++){
        for(int itr2=0; itr2<new_dim; itr2++){
            if((Va_mat(itr1,0)==sort_vmat2(itr2,0))&&(Va_mat(itr1,1)==sort_vmat2(itr2,1))&&(Va_mat(itr1,2)==sort_vmat2(itr2,2))){
                new_ind(itr_count)=itr2+1;
                itr_count++;
            }
        }
    }

    int funda=0;
    for(unsigned int Faa=0; Faa<Fa_mat.n_rows; Faa++){
        for(unsigned int Fab=0; Fab<Fa_mat.n_cols; Fab++){
            Fa_mat(Faa, Fab)=new_ind(funda);
            funda++;
        }
    }
...