David

Thanks a lot for your reply.  I actually did catch the fact that I was 
accidentally storing zeros after I had sent the message, and, you're right: it 
definitely makes the error message understandable!

I'll try your suggestions.

Best regards

Tom

-----Original Message-----
From: David Bateman [mailto:dbate...@dbateman.org] 
Sent: Thursday, January 22, 2009 5:17 PM
To: Thomas M. Ortiz
Cc: octave-dev@lists.sourceforge.net
Subject: Re: [OctDev] trouble copying sparse matrix

Thomas M. Ortiz wrote:
>
> Hello
>
> I'm using Octave 3.0.1, configured for "i686-pc-msdosmsvc". I've 
> linked the libraries into my own program using VS 2005 SP1.
>
> I am trying to copy a TNT::Sparse_Matrix<double> into an Octave 
> SparseMatrix object using the following code:
>
> void TNTOctaveInterface::exportSparseMatrix(TNT::Sparse_Matrix<double> 
> &sparseTNTMatrix, SparseMatrix *sparseOctaveMatrix)
>
> {
>
> try
>
> {
>
> for (int i = 0; i < sparseTNTMatrix.num_rows(); i++)
>
> {
>
> for (int j = 0; j < sparseTNTMatrix.num_cols(); j++)
>
> {
>
> sparseOctaveMatrix->elem(j,i) = (sparseTNTMatrix)[i][j];
>
> }
>
> }
>
> return;
>
> }
>
> catch (...)
>
> ...
>

That is a ugly way of filling a sparse matrix.. You are having to store 
even the zeros, which probably explains the crash. One complexity of the 
TNT sparse matrix conversion to Octave's format is that TNT uses 
compressed row format and Octave uses compressed column. Another 
complexity, if the header for this class I found on the web is right, is 
that TNT stores the matrix as a set of sparse vectors, and the matrix 
doesn't let you get at the vector. If it did some like


void
TNTOctaveInterface::exportSparseMatrix (const TNT::Sparse_Matrix<double> 
&sparseTNTMatrix, SparseMatrix &sparseOctaveMatrix)
{
octave_idx_type nc = sparseTNTMatrix.num_cols();
octave_idx_type nr = sparseTNTMatrix.num_cols();
octave_idx_type nz = sparseTNTMatrix.num_nonzeros();

// TNT uses compressed row and Octave compressed column. Store the transpose
// and then transpose it yet again.
sparseOctaveMatrix = SparseMatrix (nc, nr, nz);

octave_idx_type jj = 0;
sparseOctaveMatrix.xcidx(0) = jj;
for (octave_idx_type j = 0; j <nc; j++)
{
for (TNT::Sparse_Vector<double>::const_iterator p =
TNT::Sparse_Matrix::S_[j].begin();
p <TNT::Sparse_Matrix::S_[j].end(); p++)
{
sparseOctaveMatrix.xdata(jj) = p->value();;
sparseOctaveMatrix.xridx(jj++) = p->index();;
}
sparseOctaveMatrix.xcidx(j + 1) = jj;
}

sparseOctaveMatrix = sparseOctaveMatrix.transpose ();
}

will do what you want.. Maybe it'll give you ideas for your solution..


D.


-- 
David Bateman                                dbate...@dbateman.org
35 rue Gambetta                              +33 1 46 04 02 18 (Home)
92100 Boulogne-Billancourt FRANCE            +33 6 72 01 06 33 (Mob)


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Octave-dev mailing list
Octave-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to