2017-12-11 19 views
1

私はJava関数に送信したい非常に大きな希薄な行列を持っています。私はそれを達成するためのJavaコードを書いたが、遅いので、私はよりよい解決策を探している。私はR anから送信する必要がRからJavaへの疎行列を移動する

int[] ci=new int[nc]; 
    double[] vals=new double[nc]; 
    for(int i=0; i < ia.length && ro < nc; ro++){ 
     int nv=0; 

     while(i < ia.length && ro == ia[i]){ 
      ci[nv]=ja[i]; 
      vals[nv]=x[i]; 
      nv++; 
      i++; 
     } 

     if(nv==0){// add empty row 
      newList.add(Vectors.sparse(nc,new int[]{0},new double[] {0.0})); 
      continue; 
     } 
     int[] ciL=Arrays.copyOf(ci, nv); 
     double[] vaL=Arrays.copyOf(vals, nv); 
     newList.add(Vectors.sparse(nc,ciL,vaL)); 
    } 

:私はJava側で

TMPmat <- as(mySpMat, "TsparseMatrix") 
[email protected] 
[email protected] 
[email protected] 
# order by row 
ro=order(ia) 
myfun(.jarray(ia[ro],dispatch=T),.jarray(ja[ro],dispatch=T), .jarray(x[ro],dispatch=T) 

を次のように私は次のようなコードに見えるスパースベクトルのArrayListのを構築していますRから3つの配列を送っ 各行のインデックスを含むint [] []、非ゼロ要素の実際の値を含むdouble [] []

答えて

1

はるかに速く解決策が、私はまだ最適だと思う: Rコードは次のようになります。

A = Matrix::sparseMatrix(i=c(1,1,2,3,4,5),j=c(1,2,1,1,2,1), 
      x=c(0.5,0.5,1,1,1,1),dims=c(5, 2)) 
[email protected] 
[email protected] 
[email protected] 
myfun(.jarray(ia,dispatch=T),.jarray(p,dispatch=T),.jarray(x,dispatch=T), 
    nr=nrow(A)) 

Javaコード:

int[] ci=new int[nr]; 
double[] va=new double[nr]; 
for(int r=0;r < nr;r++) { 
    System.arraycopy(ia,p[r],ci,0,p[r+1]-p[r]); 
    System.arraycopy(x,p[r],va,0,p[r+1]-p[r]); 
    int[] ciL=Arrays.copyOf(ci,p[r+1]-p[r]); 
    double[] vaL=Arrays.copyOf(va,p[r+1]-p[r]); 

    newList.add(Vectors.sparse(nr,ciL,vaL)); 
} 
関連する問題