gpt4 book ai didi

java - 将稀疏矩阵从 R 移至 Java

转载 作者:行者123 更新时间:2023-11-30 06:22:57 28 4
gpt4 key购买 nike

我有一个非常大的稀疏矩阵,我想将其发送到 Java 函数。我写了一个java代码来完成这个任务,但是它很慢,所以我正在寻找更好的解决方案。我从 R 3 数组发送如下

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

在Java方面,我正在构建稀疏 vector 的ArrayList,代码如下所示:

    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[][]。

最佳答案

一个更快的解决方案,但我认为还不是最佳的: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))
ia=A@i
p=A@p
x=A@x
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));
}

关于java - 将稀疏矩阵从 R 移至 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47752505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com