[Matrix-commits] Using the Package Matrix

Henrik Alsing Pedersen henrik.alsing.pedersen at mosek.com
Mon Feb 21 14:38:12 CET 2011


I thought I would give the mailing list a try, since there hasn't been
much activity on the project homepage
https://r-forge.r-project.org/projects/matrix/

This mail will summarize my findings in a more digestible form.

************************************

I am writing a package and want my users to be able to input
double-typed matrices from the Matrix package, in either the triplet
or column-compressed format. However, the Matrix package currently
offers no way to test if a certain SEXP object qualifies as either of
the two formats. Thus I suggest -- see Feature Requests, thread #1263
-- to construct an externally available function along the lines

bool Matrix_isclass_csparse(SEXP x) {
   return Matrix_check_class_etc(x, csparse_CLASSES) >= 0;
}

where csparse_CLASSES would currently be the following char array

const char *csparse_CLASSES[] =
{"dgCMatrix", "dsCMatrix", "dtCMatrix",
 "lgCMatrix", "lsCMatrix", "ltCMatrix",
 "ngCMatrix", "nsCMatrix", "ntCMatrix",
 "zgCMatrix", "zsCMatrix", "ztCMatrix", ""};

Notice that this is no different than what is already done internally,
e.g. "as_cholmod_sparse", line 221-227 in chm_common.c.

With this function I would have the opportunity to test a SEXP object,
with no hardcoded knowledge of the supported types of the Matrix
package, and see whether I should make a call to "as_cholmod_sparse"
or "as_cholmod_triplet". If I just went ahead and called any one of
these functions directly, a wrong guess would give rise to an Rf_error
terminating the process. Notice also the bug pointed out in
"as_cholmod_triplet" in that thread..

Another bug I found -- see Bugs, thread #1283 -- concerns what I think
is a portability problem. In the function "as_cholmod_sparse", line
235 in chm_common.c, the Matrix package assumes that a 'long' has the
same size as a 'int', as it defines the choldmod itype as CHOLMOD_LONG
independently of the actual data. In that thread I give an example of
what happens when I interpret that data as type 'long' giving
erroneous output.

Kind regards
Henrik


More information about the Matrix-commits mailing list