我们尝试使用JMatio在JMatIO中输出一组Mahout SequentialAccessSparseVectors作为单个MLSparse(矩阵),供MatLab稍后使用。
免责声明:我认识Java,但我是MatLab的新手。
当我们创建一个MLSparse并用我们的向量填充它时,调用MLSparse.contentToString()例程会按照我们的预期输出数据。但是,当它被MatFileWriter写入文件时,它显示其中只有一个向量:
int nzRows = vectors.get(0).getNumNonZeroElements();
int sampleCols = vectors.size(); // MatLab is by-column, so on column/vector
int sampleRows = vectors.get(0).size(); // Rows are the Entries in the vectors
MLSparse matLabMatrix = new MLSparse( "vectors", new int[]{sampleRows, sampleCols}, 0, nzRows * sampleCols );
mergeSparse( vectors, matLabMatrix );
mergeSparse是:
private static void mergeSparse( ArrayList<SequentialAccessSparseVector> vectors, MLSparse destSparse )
{
int sampleNumber = 0;
for ( SequentialAccessSparseVector sasv : vectors )
{
Iterator<Vector.Element> iterator = sasv.iterateNonZero();
while ( iterator.hasNext() )
{
Vector.Element vectorElement = iterator.next();
int index = vectorElement.index();
double value = vectorElement.get();
destSparse.setReal( value, index, sampleNumber );
}
++sampleNumber;
}
}
作为一个人为的例子,如果我们的稀疏向量是:{1,2,3} {4,5,6} 调用.contentToString()会产生:
vectors =
(0, 0) 1
(1, 0) 2
(2, 0) 3
(0, 1) 4
(1, 1) 5
(2, 1) 6
但是。 。 。磁盘上的文件读作:
(0, 0) 1
(1, 0) 2
(2, 0) 3
任何指针都会非常感激。