2017-12-11 40 views
1

나는 자바 함수에 보내고 싶은 매우 큰 희소 행렬을 가지고있다. 나는 그것을 달성하기 위해 자바 코드를 작성했지만 더 느린 것이므로 더 나은 솔루션을 찾고있다. 나는 코드가 보이는 스파 스 벡터의 ArrayList를 짓고 있어요 자바 측에서R에서 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) 

다음과 같이 내가 R 3 개 배열에서 전송 :

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)); 
    } 

나는 R기로에서 보낼 필요 int [] [] 각 행의 인덱스를 포함하고 double [] []은 0이 아닌 요소의 실제 값을 포함합니다.

답변

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)) 

자바 코드 :

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)); 
}