| NEWS | R Documentation |
News for R Package Matrix
Changes in version 1.7-4 (2025-08-27, svn r5172)
Installation
Warnings surfaced by -Wtautological-overlap-compare are squashed. These revealed two typos in ‘src/matmult.c’ causing optimizations for
crossprod(.sRMatrix, y)andtcrossprod(x, .sRMatrix)to be skipped. Thanks to Brian Ripley and Michael Chirico for the reports.
Bug Fixes
Methods for
band,triu, andtrilwith signaturex="matrix"returned a formally invalid.geMatrix(withxslot of class"matrix") in some no-op cases, where no bands are set to zero.
Changes in version 1.7-3 (2025-03-05, svn r5126)
Bug Fixes
-
<matrix>o<sparseVector>binary"Ops"work again, returning a matrix (of"Matrix"). -
- new("lgeMatrix")and more- <Matrix>now work. Use
intinstead ofRbooleanin 2x2 cases in ‘utils-R.c’.
Changes in version 1.7-2 (2025-01-20, svn r5115)
Installation
-
Matrix can be installed with parallel
bmake. Thanks to Sebastian Meyer for the report and patch in Matrix PR#6861.
Misc
Test in ‘tests/matprod.R’ comparing
t(x) %*% xandcrossprod(x)is amended to tolerate small numerical differences seen under ‘aarch64’ Linux.
Changes in version 1.7-1 (2024-10-17, svn r4948)
Installation
Installation under architecture-specific builds of R works again. It was broken in Matrix version 1.7-0, where changes to ‘src/Makevars’ resulted in CPPFLAGS not including -I"${R_INCLUDE_DIR}${R_ARCH}".
SuiteSparse
Internal SuiteSparse and METIS library sources are patched to avoid possible use of illegal entry points.
C-Level API
Registered routine
sexp_as_cholmod_factorno longer callscholmod_check_factorbefore returning, leaving the decision to check to the caller. Accordingly, mostcholmod_check_*are registered; packages wanting to use them needLinkingTo: Matrix (>= 1.7-1).
Misc
Non-API entry points
OBJECT,IS_S4_OBJECT,SET_OBJECT,ATTRIB, andSET_ATTRIBare no longer used.
Changes in version 1.7-0 (2024-03-16, svn r4662)
Installation
-
Matrix
\ge1.7-0 depends on R\ge4.4.
Linking
The Matrix ABI version is incremented from 1 to 2.
Reverse
LinkingTobuilt under earlier versions of Matrix should be rebuilt from sources by users and maintainers of binary repositories.
SuiteSparse
The internal SuiteSparse library sources are updated from version 5.10.1 to version 7.6.0. We have so far identified one backwards incompatible change: since SuiteSparse version 7.3.0,
cholmod_sort(A)sorts but does not pack the matrixA. It seems that nowcholmod_sortandcholmod_copymust be used in conjuction if a sorted and packed result is desired. This change affects only reverseLinkingTorelying on the old behaviour. It seems that currently there are no such packages on CRAN or Bioconductor.CHOLMOD component Partition is compiled along with its dependencies (METIS, CAMD, CCOLAMD).
CXSparse is compiled instead of CSparse, which did not support complex matrices.
The internal SuiteSparse and METIS library sources are patched to squash a significant number of warnings surfaced by -Wall.
Significant User-Visible Changes
The diagonal elements of the
Rfactor computed byqr(<sparseMatrix>)are no longer constrained to be non-negative, due to differences in the implementation of functioncs_housebetween SuiteSparse libraries CSparse and CXSparse.
Classes
-
indMatrixno longer extends virtual classcompMatrixand so no longer inherits a (never used)factorsslot. Objects serialized under Matrix<1.7-0 and unserialized under Matrix\ge1.7-0 remain valid, retaining a harmlessfactorsattribute. Unexported class union
replValueSpis effectively removed, now having zero members. Actual removal is delayed until package binaries caching the old definition are rebuilt under Matrix version 1.7-0.The validity method for class
sparseQRno longer requires non-negativediag(R).
Bug Fixes
The unary subscript
x[i]is correct again forxof class.s[CT]Matrixand logicaliindexing entries outside of the stored triangle.
Changes in version 1.6-5 (2024-01-06, svn r4560)
C-Level API
Registered routine
cholmod_triplet_as_sexptransposes entries “opposite” thestypewhen that is nonzero, following CHOLMOD.-
cholmod_defaultsis registered so that calls to API functionM_cholmod_defaultsactually work.
Bug Fixes
-
x[]works forxinheriting from virtual classsparseVector. -
length(x)is always an integer forxinheriting from virtual classsparseVector. Truncation did not occur forx@lengthof type"double"equal to or greater than.Machine[["integer.max"]] + 1. -
tril(<n-by-n>, -n)now works again. -
tri[ul](<indMatrix>, k)now works correctly fork != 0.
Misc
-
%||%is defined in the Matrix namespace only for R<4.4.0.
Changes in version 1.6-4 (2023-11-29, svn r4523)
Installation
Warnings surfaced by -Wformat are squashed.
C-Level API
API function
M_chm_triplet_to_SEXP, removed in Matrix version 1.6-2, is restored (as a macro). It was “covertly” used by package Rmosek.
Bug Fixes
better deprecation message for
..2dge().
Changes in version 1.6-3 (2023-11-13, svn r4513)
Misc
With an R built with
configureoption --disable-long-double,prod(M)now very slightly differs for two differently classed versions ofM.-
checkMatrix()from ‘test-tools-Matrix.R’ gets optionalMSGargument for suppressingprod()differences.
Changes in version 1.6-2 (2023-11-05, svn r4503)
Compatibility
-
Matrix did not pass its checks under R version 3.5.0, implicitly violating
Depends: R (>= 3.5). This release restores compatibility.
Linking
Support is added for an ABI version relevant to packages that link against Matrix. The ABI version is 1 in this release and will be incremented by 1 in each future release that changes the ABI. It is implicitly 0 in previous releases. Versions and their components are defined in a header for use by packages with
LinkingTo: Matrix (>= 1.6-2)in their ‘DESCRIPTION’. See ‘inst/include/Matrix/version.h’ and (below)Matrix.Version.Reverse
LinkingTobuilt under earlier versions of Matrix should be rebuilt from sources by users and maintainers of binary repositories.
C-Level API
API headers are organized under ‘inst/include/Matrix/’ for easier namespacing. Packages should start using
LinkingTo: Matrix (>= 1.6-2)and include the API headers with, e.g.,#include <Matrix/Matrix.h>.Packages including API headers can define macro
R_MATRIX_INLINE, typically with#define R_MATRIX_INLINE inline, in order to allow the compiler to inline stubs for registered routines.Some API function prototypes and macros not used by any reverse
LinkingToare removed or remapped.Several API function prototypes used
constqualifiers where the registered routines do not.The prototype of API function
M_cholmod_band_inplacedid not match that of registered routinecholmod_band_inplace. The prototype ofcholmod_bandwas copied by mistake.
Significant User-Visible Changes
Methods for generic functions
rbind2,cbind2,%*%,%&%,crossprod, andtcrossproddetermine the class of the result using more strict rules, designed to avoid “surprising” coercions where possible. Notably, operations involvingRsparseMatrixnow return anRsparseMatrixin more cases.TsparseMatrixanddiagonalMatrixmay be handled asCsparseMatrixor asRsparseMatrix, depending on context.
Classes
New nonvirtual class
ndiMatrixrepresenting diagonal nonzero pattern matrices. It extends virtual classesdiagonalMatrixandnMatrix.ndiMatrixare typically obtained as the result ofis.na,is.nan, oris.infiniteapplied to adiagonalMatrixor as the result of coercing adiagonalMatrixtonMatrix. (The result of that coercion used to be anntCMatrix. It is still possible to obtain anntCMatrixby coercion tonsparseMatrix.)The validity method for class
sparseVectorrequireslengthnot exceeding2^53, which on most platforms is the minimum positive integerksuch thatk + 1is not exactly representable in double precision.A
dsparseVectorwithxslot of type"integer"is formally invalid, as always intended.Certain never or seldom used class unions are removed.
New Features
-
mean(<sparseVector>, trim=)now works efficiently for nonzero values oftrim. -
rep(<sparseVector>, each=)now works efficiently, avoidingrep(., times = rep(each, times = length(.))). -
.m2denseand.m2sparsegain an argumenttransindicating if vectors that are not matrices should be coerced to 1-row matrices rather than 1-column matrices. -
.m2denseand.m2sparsecan be called with one argument. Theirclassarguments admit new default values".ge"and".gC". -
.diag2denseand.diag2sparsegain an argumentkindindicating the “kind” of the result. New exports
.M2Vand.m2V, for coercingMatrixandmatrix(and in factvector) tosparseVector.New exports
isUniqueTandasUniqueT, with optional argumentbyrowallowing for row-major ordering of entries.asUniqueTsupercedesuniqTsparse, which is no longer documented.New export
aggregateT, for aggregatingTsparseMatrixwithout sorting.Methods for
all.equalnow report the packages where S4 classes are defined.-
sum(x)andprod(x)no longer require a coercion fromsymmetricMatrixtogeneralMatrix. Results where coercions are now avoided may differ numerically due to reordering of adds and multiplies, most commonly on systems wheresizeof(long double) == sizeof(double).
Bug Fixes
Methods for
cbind2andrbind2did not in all cases handle vectors as 1-column and 1-row matrices, respectively.Methods for
cbind2andrbind2did not handle 0-length vectors (includingNULL) correctly where the result would have 0 rows and columns, respectively.Methods for
cbind2andrbind2did not handleNAin thexslot ofndenseMatrixcorrectly (i.e., asTRUE).-
cbind2(<ndenseMatrix>, <ldenseMatrix>)gavengeMatrixinstead oflgeMatrix.cbind2(<lsparseMatrix>, <lsparseMatrix>)gavedgCMatrixinstead oflgCMatrix. Methods forrbind2had similar problems. -
rcond(<0-by-0>)now returnsInf; see PR#18543. -
round(<dp[op]Matrix>)andsignif(<dp[op]Matrix>)now returnds[yp]Matrixrather thandp[op]Matrixand now discardfactors. Methods for
lengthnow returnintegerrather thandoubleif the result does not exceedINT_MAX.Methods for subscripting
sparseVectordid not behave compatibly with base when supplied with fractional,NA, or out-of-bounds subscripts.-
symmpart(x),skewpart(x),band(x, k1, k2),triu(x, k), andtril(x, k)now always return a.diMatrixforxinheriting fromdiagonalMatrix. -
colSums(<(n|l|ind)Matrix>)androwSums(<(n|l|ind)Matrix>)now always give a result of type"integer". Methods differed previously, some giving"double"(as base does, suboptimally, traditional matrices of type"logical"). Some methods for generic function
ludid not transmitDimnamesto the result.Some methods for group generic function
Summaryignored arguments matching.... Other methods did not ignore the “garbage” elements of thexslot of dense, triangular matrices.-
kronecker(<n.TMatrix>, <diagonalMatrix>)threw an error for attempting to access the nonexistentxslot of its first argument. Matrix products now behave exactly as base when testing for conformable arguments.
Numeric products (
%*%) did not always return adMatrix.Methods for
all.equalnow “see” attributes of S4 objects that are not slots. This can be disabled by setting argumentcheck.attributestoNA, which is otherwise equivalent toTRUE.-
prod(x)is computed more diligently forxinheriting fromsparseMatrix,sparseVector, or.t[rp]Matrix, i.e., thosexthat can be understood to have “structural” zeros. Now, multiplication by zero occurs at the position of the first structural zero in the matrix or vector (when traversed by row in the case ofRsparseMatrix). An exception isTsparseMatrix, for which multiplication by zero occurs before multiplication by any stored entry, regardless of the position of the first structural zero in the corresponding sorted matrix (to avoid the cost of sorting). -
tri[ul](<.t[rp]Matrix>, k)was often wrong for nonzerok, setting too many bands to zero. C-level
tCsparse_diag(formerlydiag_tC) now handles structural zeros andNaNon the main diagonal correctly. Option"diagBack"now works correctly.-
expm(x)failed forxof classdtpMatrixordspMatrix, since Matrix version 1.6-1. -
.m2dense(x, ".ge")allocated unnecessarily forxwithout attributes.
Misc
-
C code now refers to the symbol
factorsasMatrix_factorsSym, rather thanMatrix_factorSym. The content of ‘src/Mutils.[ch]’ has been migrated to more transparently named files: ‘src/attrib.[ch]’, ‘src/objects.[ch]’, etc. Similarly, much of ‘src/factorizations.[ch]’ have been migrated to ‘src/solve.[ch]’ and ‘src/determinant.[ch]’.
All matrix product code has been migrated to ‘products.[Rch]’.
Files in ‘po/’ and ‘inst/po/’ have been updated due to more frequent use of
gettextfin ‘R/*.R’.-
C code is prepared to handle complex matrices and their factorizations. Notably, new machinery in ‘src/cs-etc.[ch]’ will enable linking the CXSparse library instead of the CSparse library, the latter supporting numeric types but not complex ones.
Changes in version 1.6-1.1 (2023-09-08, hotfix)
Misc
Export the generics
crossprod()andtcrossprod()explicitly, needed for R-devel when they become primitive internal generics.
Changes in version 1.6-1 (2023-08-11, svn r4228)
C-Level API
Registered routine
chm_sparse_to_SEXPsorts and packs its first argument before assigning any struct members to variables, preventing use-after-free.
Memory
Four Valgrind-detected memory bugs are fixed.
Classes
Validity methods for classes
CholeskyandpCholeskytest for a validpermslot.
New Features
Several new coercion utilities, exported and documented in
help("fastMisc"). Some of these supercede ones made available (experimentally) in Matrix 1.5-4; for example,.M2mmakes both.dense2mand.sparse2mredundant. The superceded ones are not yet formally deprecated, but are no longer documented.-
drop0is now implemented independently ofCHOLMOD, becoming more efficient notably for logical arguments, no longer requiring a coercion to double. -
drop0gains an argumentgive.Csparseto complementis.Csparse.FALSEindicates thatRsparseMatrix,TsparseMatrix, andindMatrixarguments should be handled directly, without a coercion toCsparseMatrix. The default value isTRUE, for backwards compatibility.
Bug Fixes
-
<diagonalMatrix> %*% <RsparseMatrix>works again. -
diag(<non-square RsparseMatrix>) <- valueworks again, no longer giving apslot of lengthDim[2]rather thanDim[1]. -
as(<diagonalMatrix>, "symmetricMatrix")now checks for symmetricDimnames, for consistency. as(<indMatrix>, "[nld](sparse)?Matrix") now returns a
.gRMatrixor a.gCMatrixdepending on themarginslot.-
as(<[CR]sparseMatrix>, "generalMatrix")now checks if the number of nonzero entries in the result would exceedINT_MAXand throws an error in that case.
Misc
Run speed-measuring tests only
if(doExtras): these were too slow when run under Valgrind.Most coercion code has been migrated to ‘coerce.[Rch]’ from elsewhere.
The number of methods for generic functions
coerceandas.*has been reduced substantially, from 306 to 194 (not counting deprecated ones), partly as a result of efforts to do more fine-grained dispatch in C code.Files in ‘po/’ and ‘inst/po/’ have been updated (again), as many more C level messages now use format strings as a result of
vsnprintfusage in ‘src/validity.c’.
Changes in version 1.6-0 (2023-06-30, svn r4125)
Dependencies
The following “weak” dependencies, needed only for a small number of Rd cross references, are removed: MatrixModels, expm, igraph, maptools, sp, spdep. Links to CRAN or Bioconductor in Rd files are preserved.
-
sfsmisc is moved from
EnhancestoSuggests, as Matrix does not formally enhance it with methods or links to documentation. -
grDevices and datasets are added to
ImportsandSuggests, respectively, as Matrix does import from grDevices and (in vignettes) does load data from datasets. Example, test, and vignette code no longer fails when R_DEFAULT_PACKAGES is set to
NULL.Example code uses
requireNamespaceinstead ofrequireto preserve the user's search path.
Significant User-Visible Changes
Methods for generic function
cholthat previously returned an object of classp?Choleskynow return an equivalent object of classdtrMatrixordtpMatrix. Existing code that relied (correctly) oncholto return the upper triangular Cholesky factor as aMatrixcan be expected to work as before.
Classes
Class
indMatrixgains amarginslot with value1Lor2L(1Lbeing the prototype and previously implicit value), indicating that the object represents a row or column index matrix, with ones at[i, perm[i]]or[perm[j], j], respectively.
Methods withindMatrixor its subclasspMatrixin the signature have been adjusted to account for the new slot. Notably, multiplication on the right by anindMatrixwithmargin = 2is now implemented as a column subscript, and the transpose of anindMatrixis now the same object but with “opposite”margin.Virtual class
MatrixFactorizationgains aDimnamesslot. Now all factorizations preserve theDimnamesof the original, factorizedMatrix, whereas previously classesSchur,sparseLU,sparseQR,dCHMsimpl, anddCHMsuperdid not. Users can get the value of the newDimnamesslot withdimnames(.)and set it withdimnames(.) <- value.Classes
p?BunchKaufmanandp?Choleskyno longer extenddtrMatrixordtpMatrixand in turn no longer extendMatrix. They retain slotsDim,Dimnames,uplo, andx, but notdiag. This change implies that virtual classesMatrixandMatrixFactorizationno longer intersect.Classes
p?Choleskygain apermslot with prototypeinteger(0L)to support representation of pivoted factorizations, as typically computed by LAPACK routinedpstrf.permof length 0 is valid and equivalent to the identity permutation.New nonvirtual class
pcorMatrixextendingdppMatrix. It is the counterpart ofcorMatrixusing packed storage, supporting more efficient storage of dense correlation matrices. Nowpack(<corMatrix>)gives apcorMatrixpreserving thesdslot, rather than adppMatrixwithout ansdslot.New virtual classes
BunchKaufmanFactorization,SchurFactorization, andQR, extended by existing nonvirtual classesp?BunchKaufman,Schur, andsparseQR, respectively. These are parallel to the existing virtual classesCholeskyFactorizationandLU. Packages defining new factorization classes may extend these.Virtual class
CHMfactorand its subclasses gain formal validity methods.The validity method for class
sparseQRnow tests that theVslot is lower trapezoidal and that theRslot has non-negative diagonal elements.The validity method for class
corMatrixnow tolerates nonfinite elements in thesdslot. It no longer tolerates nonunit diagonal elements in thexslot.The prototype of the
Dimslot of virtual classMatrixFactorizationis nowinteger(2L). It was previouslyinteger(0L), with the result thatvalidObject(new(<nonvirtual>))was always an error.The prototype of the
Lslot of classsparseLUis now formally lower triangular, so thatvalidObject(new("sparseLU"))is not an error.The prototypes of the
QandTslots of classSchurare now 0-by-0dgeMatrix, so thatvalidObject(new("Schur"))is not an error.
Generic Functions
New generic functions
expand1andexpand2, intended to replaceexpandand coercions from (subclasses of)MatrixFactorizationto (subclasses of)Matrix.expand1is used asexpand1(<MatrixFactorization>, <character string>)and constructs by name factors appearing in the factorization.expand2is used asexpand2(<MatrixFactorization>)and returns a named list of all factors appearing in the factorization, in order and with row names on the first factor and column names on the last factor. The result can be used to reconstruct the factorizedMatrixas the product of the elements of the list, namelyReduce(`%*%`, expand2(.)).
expandand its methods are retained for backwards compatibility. They may be formally deprecated in the future, hence new code should useexpand1andexpand2. Notably,expand1andexpand2have methods for all factorizations in Matrix, whereasexpandcontinues to have methods only fordenseLU,sparseLU, andCHMfactor. Seehelp("expand-methods")for a list of methods, including useful optional arguments.
New Features
Methods for subscripting
Matrixnow use the more systematic code in ‘R/subscript.R’ and ‘src/subscript.c’, becoming more efficient for alllsparseMatrix(no longer coercing todsparseMatrixand back), sparsesymmetricMatrix(no longer coercing togeneralMatrixand back wheniinx[i, i]is monotone),unpackedMatrix(no longer coercing tomatrixand back), andRsparseMatrix(no longer coercing toTsparseMatrix, then toCsparseMatrix, then back toTsparseMatrix[!]).
x[i, j, drop = FALSE]preserves the class ofxin more cases wherexis atriangularMatrix,diagonalMatrix, orpMatrix, doing more complete checks oniandj.
Notably, forxinheriting fromRsparseMatrix, the result is now always anRsparseMatrix, rather than always aTsparseMatrix.-
NULLsubscripts, as inx[NULL],x[NULL, j], andx[i, NULL], are now supported forxinheriting fromMatrix. They are handled asinteger(0), consistent with base. Generic function
Choleskygains methods fordenseMatrixreturning an object of classp?Cholesky. The method for subclassdsyMatrixadmits an argumentpermindicating if the pivoted factorization should be computed. The correspondingcholmethod gains an argumentpivotindicating the same. By default,Choleskypivots andcholdoes not.Many subclasses of
MatrixFactorizationcan now be coerced to “nearby” subclasses ofMatrix. The resultingMatrixreflects the internal representation of the factorization and not necessarily a particular matrix factor. The new coercions are:as(<denseLU>, "dgeMatrix"),as(<BunchKaufman>, "dtrMatrix"),as(<pBunchKaufman>, "dtpMatrix"),as(<Cholesky>, "dtrMatrix"),as(<pCholesky>, "dtpMatrix"),as(<CHMsimpl>, "dtCMatrix"), andas(<CHMsuper>, "dgCMatrix"). Seehelp("denseLU-class")(and similar) for details.-
determinant(x, ...)andsolve(a, b, ...)now work forxandainheriting fromMatrixFactorization, behaving as ifxandawere replaced by the factorizedMatrix. The exception isxinheriting fromCHMfactor, where for backwards compatibility the default behaviour is still to compute the determinant of the Cholesky factor. This exception should be considered temporary, hence defensive code will calldeterminantwith (new) optional argumentsqrtset toTRUEorFALSEexplicitly, to not rely on the current default value. Seehelp("CHMfactor-class")for details. Generic function
diaggains methods forp?CholeskyandCHMfactor. The result is a numeric vector containing the diagonal entries of the diagonal matrixD, as defined inhelp("Cholesky-class")andhelp("CHMfactor-class").The
luandqrmethods for classdgCMatrixnow admit anorderargument with value in0:3, allowing the expert user to choose among all ordering methods made available by the CSparse library.-
solve(<dgCMatrix>, b, sparse = TRUE)is now handled entirely in C code viacs_spsolvefrom the CSparse library. New utilities
invertPerm,signPerm,isPerm, andasPermfor computing the inverse and sign of a permutation vector, testing if an integer vector is a permutation vector, and coercing a transposition vector to a permutation vector.invertPermis a more general version of the already exported functioninvPerm, which is retained as a wrapper aroundinvertPermfor backwards compatibility.The
qr.Rmethod for classsparseQRgains abackPermuteargument with defaultFALSE, for compatibility with base. FunctionqrR, which existed primarily to provide a back-permuting option, is retained for backwards compatibility.
Bug Fixes
-
x[integer(0), ]andx[, integer(0)]now give ageneralMatrixresult whenxis a 0-by-0diagonalMatrix, for consistency with all other cases ofx[seq_len(n), ]andx[, seq_len(n)], wherexis ann-by-ntriangular, symmetric, or diagonal matrix. For
xinheriting fromRsparseMatrix, subassignment of the formx[i, ] <- valueis now correctly distinguished fromx[i] <- value.-
rownames(x[integer(0), , drop = FALSE])andcolnames(x[, integer(0), drop = FALSE])are now alwaysNULLand nevercharacter(0), consistent with the implementation in base. Subscript operations on
Matrixnow correctly error whenever the formal argument ... is matched, as inx[i, j, drop], wherex[i, j, drop = drop]is almost always intended.-
x[i, ]now correctly drops dimensions whenxis a 1-by-nMatrixandiisTRUE. Methods for
solvenow obey the following rules much more strictly:-
solve(a=<Matrix>, b=<vector>)must return a vector. -
solve(a=<denseMatrix>, b=<Matrix>)must return adenseMatrix. -
solve(a=<sparseMatrix>, b=<Matrix>, sparse=FALSE)must return adenseMatrix. -
solve(a=<sparseMatrix>, b=<Matrix>, sparse=TRUE)must return asparseMatrix.
resolving some longstanding incompatibilities with base.
Note that methods for sparseaand missing or sparsebhave defaultsparse = TRUE, while methods for sparseaand densebhave defaultsparse = FALSE.-
-
solve(<symmetricMatrix>)now always gives asymmetricMatrixresult.solve(<dpoMatrix>)andsolve(<dppMatrix>)preserve formal positive definiteness, giving adpoMatrixanddppMatrix, respectively. -
BunchKaufman(<matrix>)now works when argumentuplo(documented to be optional) is missing. Coercions to
corMatrixnow set the diagonal elements of the result to 1, consistent withcov2cor.-
dimnames(x) <- valuenow validatesx@Dimbeforevalueto avoid undefined behaviour in C-level check. -
chol2inv(x)now ignores the lower triangular part ofxnot inheriting fromtriangularMatrix. -
chol2inv(x)now computescrossprod(solve(x))instead oftcrossprod(solve(x))for all formally lower triangularx. Previously,crossprodwas used only for densex. -
rcond(x, norm)throws a nicer error forxof length 0. Error messages due to invalid
norminrcond(x, norm)now refer to the argument asnormrather thantype.-
rcond(x, norm)now validatesnormalso forxof classd(sy|sp|po|pp)Matrix, even if for suchxall validnormgive the same result. -
which(<[RT]sparseMatrix>, ...)now gives indices in column-major order in all cases, to be consistent withhelp("which"). Factorizations inheriting from virtual class
LUare now cached under the namedenseLUorsparseLU, depending on the nonvirtual class, rather than always under the nameLU. Note that user code should not rely on the details of the cache and should instead rely on functions such asluto retrieve cached factorizations.Errors signaled by
as(<dsyMatrix>, "dpoMatrix")andas(<dspMatrix>, "dppMatrix")now clarify that the coercions do not attempt to test for positive semidefiniteness when the matrix is not positive definite.
Memory
-
invPerm(p)no longer segfaults forpthat are not valid permutation vectors.invPerm(NA)was enough to trigger a segfault. -
C code interfacing the CSparse library tests in more places for failed allocations inside of
cs_*.
Misc
Help pages for matrix factorization classes and methods have been broadly expanded and updated to use consistent notation.
The length of the Matrix namespace has been reduced by ~15%. More than 100 unused symbols have been removed.
Updates to ‘po/*.{po,pot}’ and ‘inst/po/*’ for translators.
Changes in version 1.5-4.1 (2023-05-16, hotfix)
Installation
-
‘src/Lapack-etc.h’ uses
#ifdef PR18534fixed, adapting to PR#18534 without breaking installation under R<4.3.1.
Changes in version 1.5-4 (2023-04-02, svn r3837)
Compatibility
-
sequence.defaultis defined for R<4.0.0.
C-Level API
-
‘Rinternals.h’ is included in ‘inst/include/Matrix.h’ instead of deprecated ‘Rdefines.h’. The inclusion is done outside of
extern "C".
Deprecated and Defunct
The following low level coercion utilities, which were previously exported but always “hidden” and undocumented, are now deprecated:
..2dge,.C2nC,.T2Cmat,.asmatrix,.dense2sy,.diag2mat,.diag2sT,.diag2tT,.dsy2dsp,.dsy2mat,.dxC2mat,.m2dgC,.m2lgC,.m2ngC,.m2ngCn,.m2ngTn,.n2dgT,.nC2d,.nC2l.
The deprecations follow efforts to define more general and more systematic (but still fast) coercion utilities, to allow expert users to bypass S4 dispatch in more cases. The subset of these currently exported is documented underhelp("fastMisc"). Deprecation warnings will suggest an appropriate replacement, mostly from that list.
It is not always the case that the replacement can be “dropped in”, hence users should consult the relevant documentation when changing their code.Warnings signaled by coercion methods deprecated in Matrix 1.5-0 now correctly inherit from class
deprecatedWarning.
Memory
Calls to
sprintfare replaced by equivalent callssnprintfto avoid potential buffer overflow.
Misc
C-level utilities
Matrix_memset()andMatrix_memcpy(), both new, are now used in many places instead of API macrosMemzero()andMemcpy()which never check for overflow. C-level macroAZERO()is no longer defined.C-level macro
Calloc_or_Alloca_TO()now zero-initializes also in thealloca-using case.
Changes in version 1.5-3 (2022-11-10, svn r3772)
Dependencies
-
methods is moved from
ImportstoDependsas suggested in the WRE manual. Nowasand other basic S4 machinery are available whenever Matrix is attached. This change affects R processes started with environment variable R_DEFAULT_PACKAGES set toNULL(or any list not containing methods).
Compatibility
Test involving sparse
POSIXltin ‘tests/Simple.R’ is adapted to possible (unconditional since R version 4.3.0) existence of character componentzone.
Bug Fixes
-
dimScale(x)with argumentd1missing is no longer an error. (The default value haddiag(x, FALSE)instead ofdiag(x, names = FALSE).) -
(dim|row|col)Scale(x)is no longer an error for traditional matricesxwithout adimnamesattribute. Our
cov2cor()methods now again preserve (symmetrized!)dimnames, fixing Matrix PR#6783 reported by Ben Bolker.-
colSums()and friends now always give a named result when the marginalDimnamesare non-NULL. (Names were “forgotten” fordiagonalMatrixandindMatrixarguments.) -
colSums()and friends now respectna.rmwhen handlingdiagonalMatrixwithNAdiagonal entries. -
expand(<denseLU>)now “copies-on-modify”, no longer duplicating them*n-lengthxslot in them == ncase, when it can be used directly. -
lu(<m-by-0>),lu(<0-by-n>), andBunchKaufman(<0-by-0>)now give sensible (0-extent) results, rather than a LAPACK error, fordenseMatrix.
New Features
-
Diagonal()gets a new optionalnamesargument. -
diag(x) <- valueis now done in C also for[CRT]sparseMatrix. -
.diagU2N()gets fast counterpart.diagN2U(). -
colSums()and friends are now implemented more efficiently fordenseMatrixand[CRT]sparseMatrix. Notably, methods for triangular and symmetric matrices no longer go viageneralMatrix, and methods for[CRT]sparseMatrixnow handle nonzero pattern and logical matrices directly (no longer coercing to double, a constraint of the earlier implementation using CHOLMOD). -
determinant(<ds[yp]Matrix>)is now computed via the Bunch-Kaufman factorization. Factorizations are cached in thefactorsslot for future reuse.
Misc
C-level wrappers for LAPACK
d..trfroutines gain an argumentwarnindicating how to handleinfo > 0:warn <= 0is silent,warn = 1is a warning, andwarn > 1is an error. In the case ofdp[op]trf, for whichinfo > 0implies an incomplete factorization,infois now returned as a length-1 integer.
Changes in version 1.5-2 (2022-10-21, svn r3702)
Classes
The validity methods for classes
l[st]CMatrixnow correctly test for structurally nonzero entries on the wrong side of the main diagonal, and fail in that case. Previously, this test was performed only ford[st]Matrix.The validity method for virtual class
sparseVectoris more diligent, catching more edge cases such asNAin thelengthorislot.New validity methods for
n[st][CRT]Matrix,Schur,denseLU,p?BunchKaufman,p?Cholesky,sparseLU, andsparseQR. Notably, the following properties of factorizations are now checked: the dimensions of each factor, the orientation of each triangular (or trapezoidal) factor, and the validity of each permutation vector.
Bug Fixes
-
lu(x)@L@uplois now"L", not"U", for 0-by-0 and 1-by-1dgCMatrixx. The validity method for
corMatrixnow throws a better error when thesdslot is of type"integer"rather than"double".-
.sparseDiagonal()now agrees withDiagonal()when called with no arguments, returning a 0-by-0 (rather than 1-by-1) diagonalMatrix. -
sparseMatrix(i, j)with 0-lengthiandjnow returns a 0-by-0 matrix rather than throwing a perplexing error. -
sparseMatrix(dims = <list>)andsparseMatrix(x = <dMatrix>)now produce errors. -
diag(x) <- valuenow coercesdiagonalMatrixxiftypeof(value)is “higher” thantypeof(x@x)in the usual hierarchy, for consistency with methods fordenseMatrixand withbase::`diag<-`. Methods for
kronecker()no longer ignore themake.dimnamesargument.Printing a
sparseMatrixwithNArow or column names is no longer an error.Products of two
pMatrixobjectsxandyare now computed correctly. Previously,y %*% xwas returned instead ofx %*% y!Products
x %*% ywithxadiagonalMatrixorindMatrixandya traditional matrix or vector, or withxa traditional matrix or vector andyadiagonalMatrixorpMatrix, now treat the unclassed argument as a.geMatrixand return a.geMatrix, for greater consistency with other products involving oneMatrixand one non-Matrix.Similarly,
kronecker(x, y)with one ofxandyaMatrixand the other a traditional matrix or vector now treats the unclassed argument as a.geMatrix.-
dimnames(solve(x))is nowrev(dimnames(x))fordenseMatrixx, consistent with the handling ofdimnamesbysolve.default. Methods forsparseMatrixxhave not been addressed (yet).
Memory
In many more (but not yet all) places, C functions protect the values of
R_do_slot,Rf_getAttrib,Rf_mkString, etc. from garbage collections, squashing many new and some oldrchkwarnings.
New Features
-
is.nan(x)is now implemented for allxinheriting from virtual classMatrixorsparseVector. -
Diagonal(n=, x=)now recyclesxof any positive length to lengthn. Previously, recycling was supported only forxof length 1. Products involving
diagonalMatrixorindMatrixhave been broadly improved as follows:-
dimnames(A %*% B)is now alwaysc(dimnames(A)[1], dimnames(B)[2]). -
t?crossprod()methods involvingindMatrixor its subclasspMatrixgain aboolArithargument. Numeric and boolean products are always returned as
dMatrixandnMatrix, respectively, except in a few special cases where the product can be represented as anindMatrix. (Previously, coercions were skipped when one of the operands was unit diagonal.)Products of
diagonalMatrixwith densetriangularMatrixnow correctly give atriangularMatrixresult (and without unpacking).Products of
diagonalMatrixwith[RT]sparseMatrixnow preserve storage, no longer coercing toCsparseMatrix.-
crossprod(x, y)no longer requires the product ofncol(x)andncol(y)to be less than2^31when bothxandyareindMatrix. (The new implementation now always gives adgTMatrixresult, whereas previously the result would typically but not always be adgCMatrix.)
-
-
kronecker(<Matrix>, <Matrix>)now gives the correct “shape” (general, [unit] triangular, symmetric, diagonal) in all cases where it can be known without checking. -
kronecker(<[CR]sparseMatrix>, <Matrix>)now retains the storage of the first argument, no longer coercing toTsparseMatrix. New exported functions
dimScale,rowScale, andcolScale, for scaling rows and columns of a[mM]atrixwithout losingdimnamesand where appropriate without losing symmetry.
Changes in version 1.5-1 (2022-09-12, svn r3642)
Memory
ASan-detected memory bugs are fixed in C functions
Tsparse_as_CRsparseandpMatrix_validate. The former was triggered by.T2C(<0-by-0>)and the latter was triggered byas(<length-10000 integer>, "pMatrix").
Changes in version 1.5-0 (2022-09-09, svn r3636)
Deprecated and Defunct
With a few exceptions, direct coercions to non-virtual subclasses of
Matrix(e.g.,dsCMatrix) have been formally deprecated. For now, these will continue to work as before, but with a warning indicating how to accomplish the desired coercion via virtual classes (e.g.,symmetricMatrix) alone. How such warnings are signaled is controlled by the global optionMatrix.warnDeprecatedCoerce.0or lessis to be silent.
1is to signal a warning with each deprecated coercion.
2or greateris to signal an error with each deprecated coercion.
NAis to signal a message or warning (see below) with the next deprecated coercion and be silent after that.
If unset or invalid, then the value of the environment variable R_MATRIX_WARN_DEPRECATED_COERCE (
NAif unset) is used. This is cached when the Matrix namespace is loaded.
Option values are coerced to integer before use.
To reduce disruption to existing code, theNAcase signals messages rather than warnings with coercions to the most-used non-virtual subclasses ofMatrix, namelydg.Matrixandd.CMatrix. This may change in the future.
Classes
New virtual class
unpackedMatrixrepresenting dense matrices in unpacked format. It extendsdenseMatrixand is extended by[nld](ge|sy|tr)Matrix, i.e., the subclasses ofdenseMatrixnot extendingpackedMatrix.The validity method for
dppMatrixrequires non-negative diagonal elements, matching the validity method fordpoMatrix.The validity method for
Matrixtolerates vector types other than"character"forDimnames[[i]].
Bug Fixes
Symmetrization of
<Matrix>@Dimnamesanddimnames(<matrix>)now goes through C utilitysymmDN()in most places, resolving some earlier inconsistencies.Many more validity methods now correctly operate under the assumption that methods for superclasses have already been called, eliminating many redundant checks.
Validation of
<Matrix>@Dimnow looks at type before length, avoiding a misleading error message.Validation of
<Matrix>@Dimnamesnow avoidsisNewList, which had allowed an error message suggesting thatNULLis a list.Setting a factor on a
compMatrixis now to install the factor itself, not a copy, for efficiency and consistency with the semantics of<compMatrix>@factors[[name]] <- value.Long vector support in methods for packing and unpacking
denseMatrix, and others.-
diag<-incorrectly preserved the class of dense matrices, so that, e.g.,`diag<-`(x=<dpoMatrix>, value=-1)was still adpoMatrix. Now the result is always one of the more general.(ge|tr|sy|tp|sp)Matrix. -
t(<corMatrix>)no longer clears thesdslot.t(<p?BunchKaufman>)now returns one of the more generaldt[rp]Matrix, rather than preserving class and clearing thepermslot. -
t(<symmetricMatrix>)no longer reverses theDimnamesslot. Symmetrization ofdn <- x@Dimnamesandt(x)@Dimnameshad given different results whendn[[1]]anddn[[2]]were non-NULLand asymmetric. -
isTriangular(x, upper)had incorrectly returnedFALSEforxof classtriangularMatrixwhenupper = TRUEandx@uplo = "L"or whenupper = FALSEandx@uplo = "U".isTriangularis now equivalent toisDiagonalin those cases. -
isSymmetric()was equivalent toisDiagonal()for triangular matrices, not allowing numerical fuzz via an argumenttol. Atolargument is now implemented for all subclasses ofdMatrixexcept for those inheriting fromsymmetricMatrixordiagonalMatrix. Methods for
isSymmetricnow also look atDimnamesandnames(Dimnames), followingisSymmetric.matrixfrom base. See also New Features.-
band(x, -k, k)for sparsexusedisSymmetric(x)(which tolerates numerical fuzz) to test for symmetry, resulting in loss of information in some cases. Now it tests thatxinherits fromsymmetricMatrix, and so returnssymmetricMatrixin fewer cases. -
triu(x, k)andtril(x, k)incorrectly requiredk <= m(instead ofk <= n), form-by-nsparsex. They now accept allkfrom-mton, with fewer errors in them < ncase. -
crossprod(<Rsparse>, <Tsparse>)and similar now work again (optionalboolArithwas not passed on), fixing Matrix PR#6766 by David Cortes. Ditto fortcrossprod(), where the old result was even wrong when it had “worked”, before Matrix 1.2-0. -
as(<matrix>, "nMatrix")can now be sparse or dense, going viaMatrix(), for greater consistency with coercions todMatrixandlMatrix. (Previously, the result was always anngTMatrix.) -
forceSymmetric(<[RT]sparseMatrix>)are now more efficient, returning symmetric[RT]sparseMatrixwithout intermediate coercions toCsparseMatrix. -
tcrossprod(a, b)for unit triangular sparse matrices now works correctly. -
!<ltrMatrix>is no longer an error in the 0-by-0 unit diagonal case. Coercions among
[CRT]sparseMatrixpreserve thefactorsslot in more cases.Coercions of overallocated
l.TMatrixtodenseMatrixorCsparseMatrixnow giveTRUEinstead ofNAin theNA || TRUEcase, following conventional logic.Methods for unpacking and indexing
packedMatrixand for coercing from[CRT]sparseMatrixtodenseMatrixnow check more consistently for overflow ofR_XLEN_T_MAX.-
solve(<ddenseMatrix>, <ANY>)is removed from the method list. It had allowed infinite recursion, e.g., withsolve(new("dgeMatrix"), NULL). -
is.na(<ndenseMatrix>)gaveTRUEwhere thexslot hadNA. Now the result is always a zero matrix. -
is.na(<.t[rp]Matrix>)andis.infinite(<.t[rp]Matrix>)ignored thediagslot, behaving always as thoughdiag == "N". They now giveFALSEon the diagonal in thediag != "N"case. Now only “nontrivial” matrix elements determine whether
is.na(<denseMatrix>)is anndenseMatrixor annsparseMatrix.-
is.na(<ddenseMatrix>)coerced tolMatrix. This unnecessary step is avoided now, saving a potentially nontrivial allocation. -
solve(<ddenseMatrix>, b)coerced the first argument todgeMatrixwhenbwas not addenseMatrixor traditionalmatrix. This unnecessary step is avoided now, so that specialized methods ford(tr|sy|po|tp|sp|pp)Matrixare used where possible (including forbinheriting from[ln]denseMatrix,sparseMatrix, ornumLike). -
`dim<-`(x, -x@Dim)is now an error, no longer yielding an invalidMatrixobject. -
`dim<-`(x, x@Dim)is now faster, returningxwithout allocation in all cases. -
`dim<-`(x, value)gives a better error whenvaluecontainsNAor elements exceedingINT_MAX. -
`dim<-`(<RsparseMatrix>, value)is now anRsparseMatrix, rather than aTsparseMatrix. For consistency with other methods,
symmpart(<diagonalMatrix>)now always inherits from bothdMatrixandsymmetricMatrix, andskewpart(<diagonalMatrix>)now always has symmetricDimnames.Zeros on the diagonal of
skewpart(<[CRT]sparseMatrix>)are now structural.-
as(<ndenseMatrix>, "(vector|matrix|[dl]Matrix)")andnnzero(<ndenseMatrix>)now correctly treatNAin thexslot asTRUE. -
as(<[nl].TMatrix>, "dMatrix")now correctly handles the overallocated case: data for each unique[i,j]pair are aggregated logically (x1 || ... || xn) rather than arithmetically (x1 + ... + xn), so that elements of the result are restricted to the setc(0, 1, NA). This bug had also affected the result ofsum(<[nl].TMatrix>). -
dimnames(as(x, "matrix"))is nowNULLfor allxinheriting fromMatrix, whenx@Dimnamesis the triviallist(NULL, NULL). -
.bdiag(<named list>)no longer propagates names to theDimslot of the result. -
as(<named vector>, "denseMatrix")now correctly propagatesnamesto the result. -
as(<d.[CR]Matrix>, "lMatrix")no longer drops non-structural zeros, for greater consistency with analogous coercions. -
Matrix(x, doDiag)now behaves as documented for diagonal matricesxwith asymmetricdimnames, returning adiagonalMatrixwhendoDiag = TRUE, rather than atriangularMatrix. Matrix(<n-dimensional table>) now works for
n != 2.-
Matrix(<sparseVector>)now works for vector lengths other than 1, no longer giving an error about length mismatch when neither ofnrowandncolare supplied. -
Matrix(<diagonalMatrix>, doDiag = FALSE)is now asymmetricMatrix, not adiagonalMatrix, matching the documentation ofdoDiag. -
Matrix(<.geMatrix>, sparse = TRUE, forceCheck)andMatrix(<.g[CRT]Matrix>, sparse = FALSE, forceCheck)now respectforceCheck = FALSEby always returninggeneralMatrix, i.e., not testing for symmetric or triangular structure. -
Matrix(0, nrow, ),Matrix(0, , ncol)now throw (correct) errors fornrow,ncolin the interval[0,1), consistent withbase::matrix(). -
sparseDefault(<sparseMatrix>)now counts zeros without coercing tomatrix, makingMatrix(<sparseMatrix>, sparse = NULL)much more efficient. Methods for group generic
Mathno longer preservex@diag == "U"or losex@Dimnameswhenf(0) == 0andf(1) != 1. (The former happened fortriangularMatrixxand the latter fordiagonalMatrixx.)-
image(Z)for a completely “empty” (all 0)sparseMatrixworks again (?!). -
x[i, ] <- valueandy[, j] <- valueis now an error in more cases form-by-0CsparseMatrixxand 0-by-nCsparseMatrixy. In these cases, subassignment gave a (formally) invalid result. -
chol(<ds[yp]Matrix>)now calls the underlying C-level routine exactly once. Previously, it was called an extra time in order to test for positive definiteness, with the result thrown away (!). Hence these methods should become approximately two times faster. -
dimnames(chol(x))is identical todimnames(x)in all cases, now even whenchol(x)is constructed from a cachedMatrixFactorization, for greater consistency withbase::chol.default(). -
chol(<generalMatrix>)no longer looks atDimnameswhen testing for symmetry. -
lu(<dtCMatrix>)no longer returns an invalidsparseLUobject in the lower triangular case. -
lu(x)had sometimes incorrectly cached its return value as element"lu"(rather than"LU") ofx@factors. Now it is always"LU". -
Compareoperators, e.g.,a > b,x != y, now work correctly in more dense unitriangular and sparse 0-extent cases. -
!<nMatrix>is now always annMatrix, never anlMatrix. -
!<ndenseMatrix>andwhich(<ndenseMatrix>)now correctly handleNAasTRUE. -
anyNA(<denseMatrix>)had incorrectly returnedanyNA(.@x)in many cases, giving false positives for some.(tr|sy)MatrixandndenseMatrix. Now methods respect the “rules” of these classes. The boolean arithmetic product
A %&% Band e.g.,crossprod(A, B, boolArith=TRUE)now should behave as ifdrop0(A)anddrop0(B)were used, i.e., for formally sparse matrices, the boolean product results should be stable with respect to non-structural vs structural zeros.-
t(<symmetricMatrix>)now retains thefactorsslot, avoiding recomputation. Fixed the (quite long standing) Matrix PR#6777, reported by Manuel Koller:
tcrossprod(<matrix>, <[dln]sCMatrix>)has been wrong in some cases.
Memory
-
qr(<big sparse>)could segfault due to integer overflow inside ofcs_multiply. Now an error is signaled indicating “out of memory”. Reported by Benjamin Tyner as Matrix PR#6610. Valgrind warning originating in
cholmod_sdmultis squashed. Reported by David Cortes as Matrix PR#6726.
New Features
-
KhatriRao()gets newsparseY = TRUEoption and also works for moreMatrixclasses. Virtual class
packedMatrixgains methods forpack,unpack,isSymmetric,isTriangular, andisDiagonalimplemented in C, replacing those defined for many subclasses individually.Virtual class
unpackedMatrixgains methods forpack,unpack,isSymmetric,isTriangular,isDiagonal,t,diag, anddiag<-implemented in C, replacing those defined for many subclasses individually.-
isTriangularandisDiagonalare now implemented in C also for[CRT]sparseMatrixand standardmatrix.isSymmetricis now implemented in C for alldenseMatrixand all[CRT]sparseMatrix, though these C routines are currently only called when testing for exact symmetry (always for[ln]Matrix, only whentol = 0fordMatrix). Methods for
isSymmetricgain an argumentcheckDN = TRUEindicating whether symmetry ofDimnamesshould be checked. For backwards compatibility and consistency withisSymmetric.matrixfrom base, the actual condition ischeckDN && check.attributes.-
isTriangular(x, upper)now has akindattribute if and only ifxis triangular andupperisNA. -
diag(<unpackedMatrix>) <- valuenow behaves likediag(<packedMatrix>) <- value, supporting coercions depending ontypeof(value), consistent withdiag<-from base. -
packandunpackare now identity functions forpackedMatrixandunpackedMatrixarguments, respectively (previously an error).pack(<.geMatrix>)(previously an error) now behaves aspack(<matrix>), i.e., by checking for symmetry or triangularity before packing.unpack(<matrix>)now works and is equivalent toas(<matrix>, "unpackedMatrix"), with result inheriting from.(ge|tr|sy)Matrix, as appropriate. Many more validity methods implemented in C, for efficiency, including methods for
Matrix,compMatrix,diagonalMatrix,indMatrix,pMatrix,corMatrix,[liz]Matrix, andndenseMatrix.-
band(x, k1, k2)is optimized further for both dense and sparsex, returningtriangularMatrix,symmetricMatrix, andpackedMatrixin more cases. -
band()is now implemented also fordiagonalMatrix(onlytri[ul]()worked before). Coercions
.ge<->.g[CRT],.t[rp]<->.t[CRT],.s[yp]<->.s[CRT], and..[CRT]<->matrixare now fully implemented and optimized, with minimal intermediate allocations. These (and others) no longer rely on CHOLMOD, which had handled integer types as double and required preprocessing in many cases (withdiagU2N(), etc.).Fixes in group methods (e.g.,
>,&,|), notably for matrices inheriting from classsymmetricMatrix,triangularMatrix,lMatrix, ornMatrix.-
as.vector,as.numeric, andas.logicalare now implemented for allMatrix. Subassignment to
indMatrixis no longer prohibited, now going viaTsparseMatrix.-
indMatrixgains methods forisTriangular,isDiagonal,diag,diag<-,band,tri[ul], andforceSymmetric. It also gains coercions to more virtual classes (notablydenseMatrix) and a coercion topMatrix. -
solve(<ddenseMatrix>, <numLike>)now works in all cases. -
determinant(<ds[yp]Matrix>)is now much faster in the positive definite case, no longer going viadgeMatrix. -
diag(<[CRT]sparseMatrix>)is now done in C and is highly optimized in the.[ts][CR]Matrixcase. -
symmpartandskewpartare now done in C for alldenseMatrixand all[CRT]sparseMatrix. Both now more faithfully preserve the “storage” of their argument. (Previously,symmpart(<packedMatrix>)was anunpackedMatrix, and(symm|skew)part(<[RT]sparseMatrix>)was aCsparseMatrix.) -
as(<vector|matrix>, "([dln]?dense|[dlnCRT]?sparse)Matrix")are now fully and more consistently implemented. In the vector case, the result is now always alength-by-1generalMatrix. In the matrix case, structure is now always examined, hence the result is asymmetricMatrixortriangularMatrixin more cases. -
Matrix(<classed matrix>)now works for classes other thantable. -
lu(<dt[rpCRT]Matrix>)andlu(<ddiMatrix>)now behave more consistently. In the diagonal, upper triangular, and unit lower triangular cases, the result is obtained “directly”, i.e., without pivoting. In the non-unit lower triangular case, it is obtained with pivoting. (Previously, pivoting was never done fordtCMatrixand always done fordt[rpRT]MatrixandddiMatrix.) -
lu(x)now caches its return value also for allds.Matrixx(by default). -
readMM()now warns if the number of entries found is less than number reported in the header. -
x[i]now works fornMatrixi, just as forlMatrixi. This supports constructions such asx[is.na(x)], where the logical operation produces annMatrixbecause it is neverNA.
Misc
-
AZERO()and friends gain an argument specifying a zero constant (0 forintarrays, 0.0 fordoublearrays). C-level utilities
(R_)?[gs]et_factors()have been renamed(R_)?[gs]et_factor(), as they only ever get and set one factor.The signature of
set_factor()has been changed to match otherset*()functions: to(object,name,value)from(object,value,name).For clarity,
set_factor()now returnsvoidand is used like otherset*()functions (i.e., for its side effect). The R interface is unchanged:R_set_factor()continues to return the value being set.C-level utilities
make_[di]_matrix_(triangular|symmetric)(),packed_to_full_(double|int)(),full_to_packed_(double|int)(), andinstall_diagonal(_int)?()are replaced by safer, more consistently named ones. Previous versions allowed integer overflow.C-level utilities
dup_mMatrix_as_d?geMatrix()are replaced by the more generaldense_as_general(), which takes arguments controlling memory allocation and the “kind” of the.geMatrixresult.New C-level utility
DimNames_is_symmetric()with R interfaceisSymmetricDN(), which should be used consistently to test for symmetry of[dD]imnames. Note that these are intended to behave consistently withsymmetricMatrix_validate(), by allowing, e.g.,list(NULL, nms), but not, e.g.,list(A = NULL, B = nms).Coercions to
triangularMatrixandsymmetricMatrixare now almost all inherited fromMatrix, whose methods simply calltri[ul]()andforceSymmetric()ifisTriangular()andisSymmetric(), respectively, returnTRUE.Many of the exported
.*2*utilities have been redefined as aliases or wrappers of new, more general functions (see below). These not-yet-deprecated functions have been centralized in ‘R/denseMatrix.R’ and ‘R/sparseMatrix.R’.New C-level utilities
R_(dense|sparse)_as_kind()for coercion from one “kind” to another;R_(dense|sparse)_as_general()for coercion from triangular and symmetric to general;R_(dense|sparse)_band()for coercion to triangular (and other banded);R_(unpacked*|packed*|sparse)_force_symmetric()for coercion to symmetric;R_(dense|sparse)_as_(sparse|dense)()for coercion between dense and sparse of the same “kind” and “structure”;R_diagonal_as_sparse()for coercion fromdiagonalMatrixto any[CRT]sparseMatrix;R_(dense|sparse|geMatrix)_as_(matrix|vector)()for coercion to base matrix and vector; andtCRsparse_as_RCsparse()for the idiomsas(t(<[CR]sparseMatrix>), "[RC]sparseMatrix"). These all have not-yet-exported R wrappers.-
indTri()andindDiag()now in C, with a new argumentpackedfor efficiently indexingpackedMatrix.indDiag()now behaves sensibly in then = 0case. -
.M.kind(),.M.shape(), and (new).M.repr()are now done in C viaR_check_class_etc(), requiring a class definition only in “rare” cases.
Changes in version 1.4-1 (2022-03-21, svn r3446)
Installation
Some warnings surfaced by -Wconversion are squashed.
Compatibility
-
tryInvokeRestartis defined for R<4.0.0. Thanks to Michael Chirico for the report.
SuiteSparse
The patch for header ‘SuiteSparse_config/SuiteSparse_config.h’ is improved for Windows.
Classes
New virtual class
packedMatrixrepresenting dense matrices in packed format. It extendsdenseMatrixand is extended by[nld](sp|tp)Matrix.
Memory
Protection stack imbalances detected by
rchkare fixed.
Bug Fixes
-
diag(x)methods now mostly also keepnamesfromdimnames(x)by default and obeynames=*more generally.
New Features
Methods for subscripting
packedMatrix, includingdiag(), notably keeping names by default and fort()which are memory efficient, i.e., do not work via unpacking, thanks to Mikael Jagan.New
dmperm()implementing a Dulmage-Mendelsohn decomposition, thanks to the persistency of Mauricio Vargas (@uc.cl).Export more low-level conversion utilities:
.n2dgT,.m2ngCn,.m2ngTn.Provide some matrix multiplication methods for
RsparseMatrix.
Misc
Our C sources now use
R_Calloc(),R_Free()etc, instead of the shorter versions without 'R_'. Consequently, we get closer toSTRICT_R_HEADERS. Also, include<float.h>forDBL_EPSILON.Modified
AZERO()to work withR_xlen_tand newAZEROs()forsize_t.
Changes in version 1.4-0 (2021-12-08, svn r3419)
Compatibility
-
‘inst/test-tools-1.R’:
Sys.memGBreturnsNA.value = 2.10201on Windows, no longer callingmemory.limitwhich is a stub since R version 4.2.0.
Memory
Several low level functions are adjusted to avoid integer overflow in
i+j*mor similar. Reported by Dario Strbenac on the R-devel mailing list (“dgTMatrix Segmentation Fault”, June 10, 2021).Leak in
as(<dtCMatrix>, "denseMatrix")when the argument is unit triangular is fixed. Thanks to Bill Dunlap for the report and patch in PR#18204.Leak in
crossprod(<dsCMatrix>)is fixed. Thanks to Bill Dunlap for the report and patch in PR#18205.Leaks in
solve(<dgCMatrix>, <ddenseMatrix>)andlu(<dgCMatrix>)and when the argument is near-singular (or when memory is exhausted) are fixed. Thanks to Bill Dunlap for the report and patch in PR#18206.Leaks in
[cr]bind2(x, y)when both arguments are sparse and exactly one is nonzero pattern are fixed. Thanks to Bill Dunlap for the report and patch in PR#18210.-
solve(<dsCMatrix>, ...)restarts after catching warnings signaled fromdsCMatrix_*_solveso that memory is freed rather than leaked. Thanks to Bill Dunlap for the report and patch in PR#18214.
Bug Fixes
-
sparse.model.matrix(.., contrasts.arg = <.. ddiMatrix ..>)now works correctly, fixing Matrix PR#6673 by Davor Josipovic. -
sparse.model.matrix(..)now also works in cases the contrast matrix has become adenseMatrix; e.g., in a case usingpoly(.)in the formula; now works correctly, fixing Matrix PR#6657 and useful suggestions by Nick Hanewinckel. Fixed the internal
attr.all_Mat()auxiliary forall.equal(), notably for the case when exactly one of the matrices is a basematrix.Fixed long-standing bug in the
rbind2()method for logical dense matrices, specificallylgeMatrix, thanks to the notice by Aaron Lun.-
band(M, k1, k2)now also works whenk1 * k2is larger than 2^31-1, the maximal integer, fixing Matrix PR#6743 by Ariel Paulson. Further, it works whenMis a sparsesymmetricMatrixbut the band is not symmetric,k1 != -k2. -
sparseVector(i=integer(), length=2^33)now does show/print, after fixing a bug in thehead()method for empty sparseVectors. Reported by David Cortes as Matrix PR#6745. -
ss <- <sparseVector>[i]gave an invalid sparseVectorssasss@iwas not necessarily sorted; thanks to a report by Quran Wu. -
as(<dsyMatrix>, "generalMatrix")and similar, sometimes did not use (C-level)symmetric_Dimnames()etc; report (to R's PR#18250 by Mikael Jagan); fixed all on C level. As a consequence, you will now see more preserved dimnames after matrix transformations or operations which involved symmetric matrices. -
as(<ddiMatrix>, "matrix")no longer loses dimnames, thanks to Mikael Jagan's report as Matrix PR#6751.
Misc
No longer include ‘Rdefines.h’ as it is somewhat deprecated.
Changes in version 1.3-4 (2021-05-24, svn r3392)
Compatibility
Tests are further revised for length mismatch warning in
matrix(data, nrow, ncol)under R\ge4.2.0.
Changes in version 1.3-3 (2021-05-01, svn r3390)
Installation
-
Matrix
\ge1.3-3 depends on R\ge3.5, relaxing the dependency on R\ge3.6 introduced in Matrix version 1.3-0.
Compatibility
Tests are revised for length mismatch warning in
matrix(data, nrow, ncol)under R\ge4.2.0.
C-Level API
-
‘inst/include/cholmod.h’ and ‘inst/include/Matrix_stubs.c’ needed adjustment after the SparseSuite update in Matrix version 1.3-0. Matrix PR#6714 reported by Kasper Kristensen, who maintains TMB.
Deprecated and Defunct
-
cBind()andrBind()are now defunct: simply usecbind()andrbind()instead.
Classes
Class unions
MnumericandnumericVectorsare removed. These were unexported and unused but nonetheless visible to users, appearing as superclasses of many basic classes. Notably, a proposed change to the validity method forMnumericwould have broken classfactor, which extendedMnumericbut would not have been valid under the proposal.
Bug Fixes
Fixed a thinko (in 1.3-2): Now direct coercion from
ddiMatrixtodgCMatrix, and hence, e.g.,as(Matrix(1, sparse=TRUE), "dgCMatrix") now works.Fixed error message in <dtrMatrix> multiplication.
Fixed long-standing bug in
R[,j] <- vwhenRis anRsparseMatrix, Matrix PR#6709 by David Cortes.-
as.matrix()andas.array()now work forsparseVectoras expected; see Matrix PR#6708. -
M[,](and similar) now work as in base R; Matrix PR#6720 by David Cortes. -
-Snow works also whenShas nofactorsslot. It signalled an error, e.g., for sparse triangular matricesS; Matrix PR#6656, reported by Chun Fung (Jackson) Kwok. -
M*2and similar no longer keep cached factorizations (in 'factors' slot), but drop them via internal new.empty.factors(). Matrix PR#6606, reported by Thomas Lumley. removed a few duplicated
.alias{.}from ‘man/*.Rd’.
Misc
translation updates (of outlines only); finally added Italian (by Daniele Medri) to svn; updated French (by Philippe Grosjean), forgotten (R part of) Korean. New Lithuanian translations by Gabriele Stupuriene & Rimantas Zakauskas.
In internal
diagOdiag()method, no longer usematrix(x, n,n)whenxis longer than n*n.Eliminating the need for ‘ftp://*’, add the very small
jgl009MatrixMarket example to our ‘external/’ files.
Changes in version 1.3-2 (2021-01-05, svn r3362)
Installation
-
USE_FC_LEN_Tis defined before ‘Rconfig.h’ is included. Under R\ge3.6.2, the effect is thatFC_LEN_Tis defined when ‘R_ext/BLAS.h’ is included, and the result is that ‘R_ext/BLAS.h’ definesFCONEas a nonempty value suitable for passing character lengths from C to Fortran.
Memory
-
matrix_trfprotects two more objects from garbage collection, squashing tworchkwarnings.
Bug Fixes
-
rankMatrix()tweaks for the singular values based methods, notablymethod = "maybeGrad". -
as(new("dtCMatrix", diag="U"), "matrix")now works, as C-leveldiagU2N()now also works for 0-dimensional triangular matrices; this also fixes a subsetting (“indexing”) bug of such 0-dimensional matrices, thanks to a report by Aaron Lun. logical subsetting of 0-dim. (diagonal/triangular) matrices fixes.
-
chol(<diagonal dt[CRT]Matrix>)now works.
Changes in version 1.3-1 (2020-12-23, svn r3352)
Bug Fixes
-
rankMatrix(<dense>, method="qr.R")no longer assumes non-negative diagonal entries of theRmatrix.
Changes in version 1.3-0 (2020-12-15, svn r3351)
Installation
-
Matrix
\ge1.3-0 depends on R\ge3.6. Macro
FCONEis defined and used to pass character lengths from C to Fortran under R\ge3.6.2 (without breaking installation under older R). Thanks to Brian Ripley.
SuiteSparse
The internal SuiteSparse library sources are updated from version 4.2.1 to version 5.7.1. The change is visible in
.SuiteSparse_version().
Significant User-Visible Changes
-
Matrix(*, doDiag=TRUE)wheredoDiag=TRUEhas always been the default is now obeyed also in the sparse case, as alldiagonalMatrixare alsosparseMatrix.
Matrix(0, 3,3)returns addiMatrixinstead of adsCMatrixpreviously. The latter is still returned fromMatrix(0, 3,3, doDiag=FALSE), and e.g.,.symDiagonal(3,pi).
Also a triangular matrix, e.g.,dtrMatrixis detected now in cases withNAs.
This is both a bug fix and an API change which breaks code that assumesMatrix(.)to return aCsparseMatrixin cases where it now returns adiagonalMatrix(which does extendsparseMatrix).
New Features
Subassignment to
diagonalMatrixnow returns sparsetriangularMatrixmore often; also (sparse)symmetricMatrix.-
nearPD()gets new option: Ifbase.matrix = TRUE, the resultingmatcomponent is a basematrix, as often used desired whennearPD()is used outside the Matrix package context. Factored out new
qr2rankMatrix()utility fromrankMatrix().New
BunchKaufman(<matrix>)method.Added
wrld_1degsparse matrix example to distributed version of Matrix (no longer excluding it via ‘.Rbuildignore’).New (simple)
mat2triplet()function to be used instead ofsummary(<sparseMatrix>)in code.Internal
.diag2tT()gains new optiondrop0 = TRUEand hence now by default drops zero diagonal entries. Consequently, e.g.,as(<diagonalMatrix>, "CsparseMatrix")now drops such zeros, too.-
sparseMatrix()gets new argumentrepr = "C", superseding the (now deprecated)giveCsparse = TRUE. Allows to returnRsparseMatrix.Similarly,
rsparsematrix(),fac2sparse()andfac2Sparse()get the newreprargument and theirgiveCsparseis deprecated, sometimes only informally for now. -
sparse.model.matrix()gets optionsep = "", with, e.g.,sep = ":"allowing to get easier column names; from Matrix PR#6581, by Vitalie Spinu.
Memory
The second argument in calls to
cholmod_factorize_pfrominternal_chm_factorwas a pointer to 1doubleinstead of adoublearray of length 2, resulting in buffer overflow there.
Bug Fixes
-
rankMatrix(<sparse>, method="qr")now returnsNA(orNaN) instead of signalling an error in the case the sparseQ Rdecomposition gaveNAs indiag(R). Coercion (
as(., .)) from e.g.,lsyMatrixtoCsparseMatrixsilently made asymmetric dimnames symmetric, as did the internalforceCspSymmetric(*, dimNames)which may be called fromforceSymmetric().-
Matrix PR#6659, reported by Georg Kindermann:
<sparseVector>[i] <- valbug is fixed. -
Matrix PR#6666, reported by Ezra Tucker:
which(<ldiMatrix>, array.ind=TRUE)thinko is fixed. For R-devel Dec 4, 2020: adapt all.equal() check of sparse matrix images (which contain panel functions with environments).
Changes in version 1.2-18 (2019-11-26, svn r3300)
Compatibility
-
‘inst/test-tools-1.R’: a bug-fixed
canCoerceis used under R<3.6.2.
Memory
-
ddense_skewpartprotects another object from garbage collection, squashing a remainingrchkwarning.
Bug Fixes
-
as(m, "dgTMatrix")does not losedimnamesanymore whenmis a (traditional)matrix. -
M[logical(0), ]now has dimension0 x kfor sparseMas for base matrices. -
log(M, base)(the 2-argument version oflog()) wrongly gave the result forbase = exp(1), i.e., the 1-argument default. -
‘test-tools-Matrix.R’:
Qidentical()no longer assumesclass(<matrix>)to be of length 1.
Changes in version 1.2-17 (2019-03-20, svn r3294)
Compatibility
-
isFALSEis defined for R<3.5.0.
Memory
-
C functions protect more objects from garbage collection, squashing several
rchkwarnings.
Changes in version 1.2-16 (2019-03-04, svn r3291)
New Features
regression tests depending on
sample()now are future proof reproducible, viaRNGversion(.).give information about #{rows} and #{columns} that are suppressed in print()ing if the matrix is larger than
max.print.
Bug Fixes
-
data(<Matrix-data>)no longer attaches Matrix to the search path. -
Opsgroup methods, i.e.,Arith,Compare,Logic, now should all work with 0-extent matrices as well, thanks to bug reports by Aaron Lun, University of Cambridge. when printing and formatting sparse matrices, see
formatSpMatrix(), themaxpoption, e.g., fromgetOption("max.print"), is “rounded up” to 100, as very small values are very rarely appropriate.
Changes in version 1.2-15 (2018-08-20, svn r3283)
New Features
-
image()gets new optional argumentborder.color.
Bug Fixes
-
image(Matrix(0, n,m))now works.
Changes in version 1.2-14 (2018-04-08, svn r3278)
New Features
German translation updates.
Memory
-
dgCMatrix_cholsolprotects one more object from garbage collection, squashing anrchkwarning.
Changes in version 1.2-13 (2018-03-25, svn r3275)
New Features
Faster
as(<matrix>, "sparseMatrix")and coercion todgCMatrix,ngCMatrix, etc, via new direct Cmatrix_to_Csparse()which does not go viadgeMatrix. This also works for large matricesm, i.e., whenlength(m) >= .Machine$integer.max.Also provide low-level R functions
.m2dgC(),.m2lgC(), and.m2ngC()for these.
Memory
-
C functions protect more objects from garbage collection, to be “rather safe than sorry”. Thanks to Tomas Kalibera's
rchktools.
Bug Fixes
-
cbind(NULL,<Matrix>)no longer returnNULL; analogously forrbind(),rbind2(),cbind2(), fixing very long standing typo in the corresponsingcbind2()andrbind2()methods. The deprecation warning (once per session) for
cBind()andrBind()finally works (fixing a simple thinko).-
cbind()andrbind()for largish sparse matrices no longer gives an error because of integer overflow (in the default case wheresparseis not been specified hence is chosen by annzero()based heuristic). -
.symDiagonal(5, 5:1)and.trDiagonal(x = 4:1)now work as expected. -
Sp[i]now is much more efficient for large sparse matricesSp, notably when the result is short. -
<sparseVector>[ <negative integer> ]now also gives the correct answer when the result is “empty”, i.e., all zero or false. large
dspMatrixanddtpMatrixobjects can now be constructed vianew(*, Dim = *, x = *)also whenlength(x)is larger than 2^31 (as the C internal validation method no longer suffers from integer overflow).
Changes in version 1.2-12 (2017-11-10, svn r3239)
New Features
-
crossprod(x,y)andkronecker(x,y)have become considerably more efficient for largeindMatrixobjectsx, y, thanks to private nudging by Boris Vaillant.
Bug Fixes
-
Matrix PR#6185:
c < 0now also works for derived sparse Matrices (which only contain Matrix classes); via improving hiddenMatrixClass(). Part of such derived matrices only work in R\ge3.5.0. using
Authors@Rin ‘../DESCRIPTION’ to list all contributors.-
solve(-m)no longer should use a cached Cholesky factorization (ofm).
Changes in version 1.2-11 (2017-08-10, svn r3225)
Compatibility
-
length(<NULL>) <- valueis avoided as it is deprecated in R\ge3.5.0.
New Features
S4 method dispatch no longer emits ambiguity notes (by default) for everybody, apart from the package maintainer. You can reactivate them by
options(Matrix.ambiguityNotes = TRUE)
Bug Fixes
-
rankMatrix(<matrix of all 0>)now gives zero for all methods, as it should be. -
qr.coef(<sparseQR>, y)now finally has correct (row) names (from pivot back permutation). -
.trDiagonal()utility is now exported.
Changes in version 1.2-10 (2017-04-19, svn r3216)
Memory
-
C functions protect more objects from garbage collection. Thanks to Tomas Kalibera's
rchktools.
Changes in version 1.2-9 (2017-03-08, svn r3211)
New Features
-
Opsbetweentable,xtabs, and our matrices now work. -
as(matrix(diag(3), 3, dimnames=rep(list(c("A","b","c")),2)), "diagonalMatrix")@xis no longer named. -
norm(x, "2")now works as well (and equivalently tobase::norm). -
sparseVector()now also works withoutxargument. -
c.sparseVector()method forc()of sparseVectors (and available as regular function on purpose).
Bug Fixes
-
as(Diagonal(3), "denseMatrix")no longer returns a non-denseddiMatrix. -
S[sel,] <- valueand similar no longer segfault, but give a"not (yet?) supported"error for sparse matricesSand logicalselwhenselcontainsNAs.The same error (instead of a low-level one) is signalled for indexing (with NA-containing logical
sel), i.e.,S[sel,]. -
which(x, arr.ind=TRUE, *)(whenxis alMatrixornMatrix) now works the same asbase::which, obeying an optionaluseNamesargument which defaults toTRUE. Previously, the resulting two-column matrix typically had emptydimnames.
Changes in version 1.2-8 (2017-01-16, svn r3201)
Compatibility
Methods for
Opshandle 0-length operands more consistently, matching changes planned for R version 3.4.0.
SuiteSparse
-
SuiteSparse_longis defined asint64_ton all platforms. Hence we now include C99 header ‘inttypes.h’. The internal CSparse library sources are patched to avoid buffer overflow in
cs_usolveandcs_utsolvewhenUis singular.
Bug Fixes
-
x[.] <- valuenow also works forsparseVector, both asxand asvalue. -
x[FALSE] <- valuenow also works forsparseVector. -
rep(x, *)now works forsparseVectorand sparse and denseMatrix-classed matricesx.
Changes in version 1.2-7.1 (2016-08-29, svn r3187)
Installation
-
_POSIX_C_SOURCEis defined conditionally with#ifdef __GLIBC__.
Changes in version 1.2-7 (2016-08-27, svn r3185)
New Features
-
cBind()andrBind()have been almost silently deprecated in R\ge3.2.0 and now give a warning, “once per session” only. -
bandSparse(*, k=k, *)now returns matrices inheriting fromtriangularMatrixwhen obvious from the diagonal indicesk.
Bug Fixes
-
KhatriRao(X,Y)now also works whenXorYis completely zero.
Changes in version 1.2-6 (2016-04-27, svn r3175)
Bug Fixes
The 0-dim. Matrix multiplication fix in 1.2-5 did trigger wrong warnings in other diagonal matrix multiplications.
Changes in version 1.2-5 (2016-04-14, svn r3170)
New Features
-
isSymmetric(m)now also works forindMatrixm. -
isSymmetric(m)is faster for large dense asymmetric matrices.
Bug Fixes
Matrix multiplications (
A %*% B) now work correctly when one of the matrices is diagonal and the other has a zero dimension.
Changes in version 1.2-4 (2016-02-29, svn r3162)
New Features
-
sparseMatrix()gets new argumenttriangularand a smarter default fordimswhensymmetricortriangularis true. -
as(<sparse>, "denseMatrix")now works in more cases whenprod(dim(.))is larger than2^{31} - 1. Hence, e.g.,!Snow works for much larger sparse matricesS.
Bug Fixes
creating very large dense matrices, e.g., by
as(<sparseM.>, "matrix")would segfault (in case it could allocate enough storage).
Changes in version 1.2-3 (2015-11-19, svn r3155)
C-Level API
-
‘inst/include/Matrix.h’ tries harder to define ‘alloca’ correctly for compilers that do not define
__GNUC__.
New Features
-
MatrixClass()is exported now. More exports of semi-internal functions (for speed, named
.<foo>, i.e., inofficial API), such as.solve.dgC.lu().more Korean translations
Bug Fixes
extended
n?CMatrixclasses (e.g., fromsetClass(., contains="ngCMatrix")) now can be coerced viaas(.)tod.CMatrix.The printing of largish sparse matrices is improved, notably in the case where columns are suppressed, via new
fitWidth = TRUEoption inprintSpMatrix2().-
cbind2()andrbind2()no longer fail to determinesparsewhen it is unspecified and henceNA, fixing Matrix PR#6259.
Changes in version 1.2-2 (2015-07-03, svn r3131)
Dependencies
Objects are more systematically imported from “base” packages like stats. It is no longer assumed that those packages are attached.
Bug Fixes
Our
colSums(x),rowMeans(y), ..., methods now “keep names”, i.e., if the result is a numeric vector, and the matrixxhas column or row names, these become thenames(.)of the result, fixing Matrix PR#6018.
Changes in version 1.2-1 (2015-05-30, svn r3127)
New Features
-
Matrixnow has aninitialization()method coercing 0-length dimnames components toNULLand other non-NULLdimnames tocharacter. Before, e.g., numeric dimnames components partially worked, even though it has always been documented that non-NULLdimnames should becharacter. -
as.vector(<sparseVector>)etc, now work, too. -
lu(<sparseMatrix>)now keepsdimnames. better ‘NEWS.Rd’ (which pleases Kurt and
tidy;-)
Memory
Using
allocato perform large allocations could overflow the stack, leading in some cases to a segfault. Nowallocais used only for small allocations. Thanks to a report on the R-help mailing list (“does segfault mean (always) a bug?”, May 5, 2015).
Bug Fixes
-
S[] <- TandS[] <- spVnow work (in more cases) for sparse matrices S, T and sparseVectorspV. Optional arguments in
image(), e.g.,main=<..>)now also work forlgCMatrix,nMatrixetc; thanks to a 4.5 years old report by Mstislav Elagin.-
dimnames(A) <- valnow resets thefactorsslot to empty, as the factorizations now keep dimnames more often. -
crossprod(<matrix>, Diagonal(<n>))works again (and these are tested more systematically). Matrix products (
%*%,crossprod, andtcrossprod) fordtrMatrixare correct in all cases, including keeping dimnames.-
Matrix(d)(and other coercions toMatrix) now correctly keepsdimnamesalso whendis a traditional diagonal matrix.
Changes in version 1.2-0 (2015-04-03, svn r3096)
Generic Functions
New generic function
%&%for boolean matrix multiplication: that is, matrix multiplication using boolean arithmetic.
New Features
New argument
boolArith = NAincrossprod()andtcrossprod().boolArith = TRUEnow forces boolean arithmetic, whereboolArith = FALSEforces numeric one. Several of these products are more efficient thanks to new C functionality based on our newchm_transpose_dense(), and others based ongeMatrix_crossprod,geMatrix_matrix_mm, etc.Most dense matrix products, also for non-
dgeMatrix, includingl..Matrixandn..Matrixones are now directly handled by new.Call()s.-
dMatrix(numeric) andlMatrix(logical) matrices can now be coerced tonMatrix(non-zero pattern or “boolean”) even when they containNAs, which then becomeTRUEs. More thorough checking of
cbind2()andrbind2()methods, notably as they are called fromcbind()andrbind()from R\ge3.2.0.rbind2(<dense>, <dense>)is faster, being based on new C code.symmetric Matrices (i.e., inheriting from
symmetricMatrix) are allowed to havedimnamesof the formlist(NULL, <names>)and now print correctly and get correctly coerced to general matrices.-
indMatrixobject (“index matrices”) no longer need to be “skinny”. -
rsparseMatrix()now acceptsrand.x = NULLand then creates a random pattern matrix (nsparseMatrix). -
anyDuplicatedT()anduniqTsparse()low level utilities are exported now. Partial Korean translations of messages.
Deprecated and Defunct
For R
\ge3.2.0,cBind()andrBind()are deprecated, as they are no longer needed sincecbind()andrbind()do work automatically.
Bug Fixes
Fix some
rbind2()methods.-
t()now transposes the dimnames even for symmetric matrices. -
diag(M) <- valdid not always recyclevalto full length, e.g., whenMwas adtrMatrix. -
crossprod(<indMatrix>)was wrong in cases where the matrix had all-zero columns. Matrix products (
%*%,crossprod, andtcrossprod) with one sparse and one dense argument now return numeric (adMatrix) when they should, i.e., unless the new settingboolArith = TRUEis applied.
Changes in version 1.1-5 (2015-01-18, svn r3037)
Compatibility
Methods for matrix multiplication (
%*%,crossprod,tcrossprod) are revised to match the behaviour of R\ge3.2.0, which better tolerates matrix-vector products.
New Features
More use of
anyNA()(for speedup).-
isTriangular()gets new optional argumentupper = NA.
Bug Fixes
-
crossprod()andtcrossprod()fixes for several <diagonal> o <sparse> combinations. -
rowMeans(<dgeMatrix>, na.rm=TRUE)was wrong sometimes. fix and speedup of coercions (
as(., .)) from and to symmetric or triangular matrices.-
invPerm()coercion to integer -
dimnames( solve(.,.) )fix [r3036] -
tril()andtriu()now return correctuplo. -
names(dimnames(.))now preserved, e.g. insymmpart()or subsetting (A[i,j]).
Changes in version 1.1-4 (2014-06-14, svn r2994)
New Features
new
rsparsematrix()for random sparse Matrices.improved warnings, notably for unused arguments previously swallowed into
....
Bug Fixes
-
crossprod(<vec>, <dsyMatrix>)fixed. -
crossprod()andkronecker()fixes for some <indMatrix> cases.
Changes in version 1.1-3 (2014-03-30, svn r2982)
New Features
-
%*%andcrossprod()now also work withsparseVectors. speedup of
crossprod(v, <sparseM>), thanks to nudge by Niels Richard Hansen.new help page for all such matrix products (‘../man/matrix-products.Rd’).
Bug Fixes
-
image()now gets correctylimagain. More consistent matrix products.
Changes in version 1.1-2-2 (2014-03-04, svn r2966)
Bug Fixes
correct adaption to R 3.1.0
using
tolerance(and not ‘tol’) inall.equal()
Changes in version 1.1-2 (2014-01-28, svn r2962)
New Features
export fast power-user coercion utilities
.dsy2mat(),.dxC2mat(),.T2Cmat(),..2dge().
Bug Fixes
matrix products now (mostly) work with
sparseVectors; and correctly in some more cases.
Changes in version 1.1-1.1 (2013-12-30, svn r2957)
Installation
-
Matrix
\ge1.1-1.1 depends on R\ge2.15.2 to ease checking.
Compatibility
-
‘inst/test-tools-1.R’:
assertConditionis defined for R<3.0.2 and used byassertWarningthere.
Changes in version 1.1-1 (2013-12-28, svn r2933)
New Features
-
image(.., xlim, ylim): nicer defaults for the axis limits, andylimis sorted decreasingly; not strictly back-compatible but should never harm. -
rankMatrix(*, method="qr")now usingtol -
T2graph()andgraph2T()export old functionality explicitly. Tweaks in conversions betweengraphandsparseMatrixobjects. Notably,as(<graph>, <Matrix>)now more often returns a (0/1 pattern) n..Matrix. -
sparseMatrix(): newuse.last.ijargument.
Bug Fixes
-
KhatriRao(): fix rownames (X <-> Y) -
qr.coef(),qr.fitted, andqr.residnow also work with sparse RHSy. sparse matrix “sub assignments”, e.g.,
M[ii] <- v, speedup and fixes.bug fixes also in
M[negative indices] <- valueand<sparseMatrix>[cbind(i,j)].
Changes in version 1.1-0 (2013-10-21, svn r2930)
Dependencies
-
methods, stats, utils, and lattice are moved from
DependstoImports.
SuiteSparse
The internal SuiteSparse library sources are updated to the latest version. Use new function
.SuiteSparse_versionto get the version in use.
C-Level API
-
‘inst/include/cholmod.h’ is updated to reflect changes in SuiteSparse. Notably, there were changes in the layout of the various
cholmod_*_struct.
New Features
-
fac2sparseandfac2Sparsenow exported, with a newgiveCsparseoption.
Bug Fixes
fixed long lasting undetected
solve(<dsCMatrix>, *)bug.Our
all.equal()methods no longer sometimes returnc("TRUE", "....difference..").-
rankMatrix(<matrix>): fix the internalx.densedefinition.
Changes in version 1.0-14 (2013-09-12, svn r2907)
Bug Fixes
Revert some wrong changes to
solve(<sparse>, *)from 1.0-13 (“stop gap fix” for R 3.0.2).
Changes in version 1.0-13 (2013-09-10, svn r2904)
Classes
New nonvirtual class
indMatrixrepresenting row index matrices, i.e., matrices whose rows are standard unit vectors. It extendssparseMatrixand is extended bypMatrix, the class of permutation matrices.
Generic Functions
New generic functions
isTriangularandisDiagonalfor testing if the argument is (upper or lower) triangular or diagonal. These were defined previously but never exported or documented.
New Features
Many methods for
pMatrixare generalized to supportindMatrix. All (initial) functionality was contributed by Fabian Scheibl, Univ. Munich.New (efficient)
KhatriRao()function by Michael Cysouw-
rankMatrix(M, method="qr")no longer needssvalwhich makes it considerably more useful for large sparseM. Start providing
anyNAmethods for R\ge3.1.0.-
solve(<sparse> a, <sparse> b): ifais symmetric, now compute sparse result. -
nearPD()gets new optionconv.norm.type = "I". -
determinant(<dpoMatrix>)now useschol(), and hence also an existing (‘cached’) Cholesky factor. 3 new
C -> Rutilities (including hidden R function.set.factors()for caching also from R, not just in C).
Bug Fixes
-
M[] <- vfor unitriangularMnow correct. -
lu(.)no longer sometimes returns unsorted columns.
Changes in version 1.0-12 (2013-03-26, svn r2872)
New Features
.
Bug Fixes
.
Changes in version 1.0-11 (2013-02-02)
New Features
.
Bug Fixes
-
as(<csr>, "dgCMatrix")(from package SparseM) now works again. .
Changes in version 1.0-10 (2012-10-22)
New Features
-
.sparseDiagonal(): newunitriargument, and more flexibility; new
solve(<dsCMatrix>, <missing>)via efficient C code.
Bug Fixes
.
Changes in version 1.0-9 (2012-09-05)
New Features
new
sparseVector()constructor function.-
is.finite()is.infinite()now work for our matrices andsparseVectorobjects. -
diag(.) <- Vnow preserves symmetricity, triangularity and even uni-triangularity sometimes.
Bug Fixes
Quite a few fixes for
Ops(arithmetic, logic, etc) group methods.Ditto for
diagonalMatrixmethods.
Changes in version 1.0-6 (2012-03-16)
New Features
.
Bug Fixes
.
Changes in version 1.0-5 (2012-03-15)
New Features
.
Bug Fixes
.
Changes in version 1.0-4 (2012-02-21)
New Features
.
Bug Fixes
.
Changes in version 1.0-3 (2012-01-13)
New Features
.
Bug Fixes
.
Changes in version 1.0-2 (2011-11-19)
New Features
.
Bug Fixes
.
Changes in version 1.0-1 (2011-10-18)
New Features
.
Bug Fixes
.
Changes in version 1.0-0 (2011-10-04)
New Features
.
Bug Fixes
.
Changes in version 0.9996875-3 (2011-08-13)
New Features
.
Bug Fixes
.
Changes in version 0.9996875-2 (2011-08-09)
New Features
.
Bug Fixes
.
Changes in version 0.9996875-1 (2011-08-08)
New Features
.
Bug Fixes
.
Changes in version 0.999375-50 (2011-04-08)
New Features
.
Bug Fixes
.
Changes in version 0.95-1 (2005-02-18, svn r561)
Authorship
During Douglas Bates' sabbatical in Zurich, Martin Maechler becomes co-author of Matrix.
New Features
Beginning of class reorganization with a more systematic naming scheme.
Bug Fixes
More (correct) coercions
as(<from>, <to>).
Changes in version 0.9-1 (2005-01-24, svn r451)
New Features
lme4 / lmer specific R code moved out to lme4 package.
Bug Fixes
.
Changes in version 0.8-2 (2004-04-05, svn r51)
Description
-
Matrix version 0.8-2 is a full refactor. Classes, generic functions, and methods are newly implemented in S4. S3 machinery is removed. The remaining items in this section describe the state of things in version 0.8-2 rather than changes since version 0.3-26.
-
Matrix
\ge0.8-2 depends on R\ge1.9.0. -
Depends: methodsis added to ‘DESCRIPTION’. Douglas Bates becomes the sole author of Matrix.
The package is retitled “Classes and Methods for Numerical Linear Algebra using LAPACK, LDL, TAUCS, METIS, and UMFPACK”.
The package sources are now maintained in a Subversion repository.
Changes in version 0.3-26 (2003-11-03)
Bug Fixes
The default expressions of formal arguments
transposeandleftof generic functionfacmulare changed fromFandTtoFALSEandTRUE, as only the latter are reserved words.
Changes in version 0.3-25 (2003-10-30)
Deprecated and Defunct
S3 generic function
determinantis removed as it was ported to R\ge1.8.0.
Significant User-Visible Changes
A namespace for Matrix is defined using directives in ‘NAMESPACE’.
S3 generic functions
eigen,expand,facmul,lu,norm,rcond,schur, andunpackare exported.S3 methods are registered and not exported, hence they continue to be available but only through calls to exported S3 generic functions.
Functions
Matrix,SVD,as.Matrix,diagDet, andhilbertare exported.Functions
Matrix.class,*.test, andis.*are exported but intended only for internal use.Functions
asObjectandprependClassare not exported.Load hook
.First.libis removed and replaced by auseDynLibdirective in ‘NAMESPACE’.
Changes in version 0.3-24 (2003-04-20)
Significant User-Visible Changes
S3 generic function
detis renameddeterminant.
Methods
-
determinant.Matrix(formerlydet.Matrix) computes theLUfactorization of its argument instead of theQRfactorization.
Changes in version 0.3-23 (2003-03-30)
Description
-
Matrix
\ge0.3-23 depends on R\ge1.7.0.
Installation
-
‘configure’, ‘configure.in’, ‘configure.win’, ‘cleanup’, ‘src/Makevars.in’, and ‘src/Makevars.win’ are removed and replaced by a simple ‘src/Makevars’ arranging for Matrix to use R's
LAPACK_LIBSandBLAS_LIBS. The simplification is made possible by R version 1.7-0, which is configured by default to build, link against, and install a shared LAPACK.
Changes in version 0.3-22 (2003-02-03)
Bug Fixes
Empty directory ‘data’ is removed.
Changes in version 0.3-21 (2002-10-25)
Description
The package is retitled “Classes and Methods for Numerical Linear Algebra using LAPACK”.
Installation
-
‘configure.win’ and ‘src/Makevars.win’ are added to support installation under Windows, thanks to Brian Ripley.
More
#undefin the C++ sources to support installation under Windows, thanks to Brian Ripley.
Changes in version 0.3-20 (2002-10-08)
Installation
-
‘configure.ac’ sets
CFLAGSbefore expandingAC_PROG_CCand setsFLIBSbefore expandingACX_BLASandACX_LAPACK. Autoconf macro
OCTAVE_BLAS_LIBS, which is no longer used, is removed from ‘aclocal.m4’.
Bug Fixes
Unwanted Autoconf output is removed from ‘aclocal.m4’.
Changes in version 0.3-19 (2002-07-22)
Bug Fixes
-
PACKAGE = "Matrix"is passed to.Callto restrict name lookup to Matrix. The C++ sources use qualified name lookup (as in
std::<name>) in more places.The C++ sources get pointers to matrix data without taking the address of the first element, which is wrong for a matrix of length 0.
Changes in version 0.3-18 (2002-05-03)
Compatibility
-
*_ELTmacros are no longer defined for R<1.2.0 as Matrix depends on R\ge1.5.0.
Changes in version 0.3-17 (2002-04-30)
Description
-
Matrix
\ge0.3-17 depends on R\ge1.5.0.
Installation
-
‘configure.in’ is replaced by ‘configure.ac’ contributed by Kurt Hornik. ‘configure.ac’ makes use of
R CMD config, a utility added in R version 1.5-0. Autoconf macros
ACX_BLASandACX_LAPACK, written by Steven G. Johnson, are added to ‘aclocal.m4’ and expanded in ‘configure.ac’.The configured value of
LAPACK_LIBSis prepended toPKG_LIBSin ‘src/Makevars.in’.
Changes in version 0.3-16 (2001-12-10)
Documentation
A preliminary ‘ChangeLog’.
Compatibility
Rd files are adapted to use
\method{}{}markup introduced in R version 1.2.2.One usage of
.Alias, deprecated in R version 1.4.1, is removed.
Bug Fixes
S3 methods gain formal argument
...where needed to match the generic function.The name of a class member function in ‘src/tgmd.h’ was was spuriously qualified.
Changes in version 0.3-15 (2001-05-15)
Installation
The configured value of
BLAS_LIBSis prepended toPKG_LIBSin ‘src/Makevars.in’.
Changes in version 0.3-13 (2001-05-10)
Installation
The C++ sources undefine macros
lengthandappendin many places to allow for class member functions with those names.
Changes in version 0.3-10 (2001-05-04)
Bug Fixes
The C++ sources use qualified name lookup (as in
std::<name>) in more places.
Changes in version 0.3-9 (2001-03-09)
Bug Fixes
The C++ sources no longer write to
stderrand (in most places)stdout, no longer use theassertmacro, and no longer callexit.
Changes in version 0.3-8 (2001-01-10)
Description
-
‘DESCRIPTION’ gets a
Maintainerfield and Douglas Bates is named there.
Bug Fixes
Removes around 100 non-source files wrongly bundled in Matrix version 0.3-7.
Changes in version 0.3-7 (2000-12-03)
Installation
-
FLIBSis appended toPKG_LIBSin ‘src/Makevars.in’.
Documentation
A basic ‘README’.
Changes in version 0.3-6 (2000-10-30)
Description
-
Matrix
\ge0.3-6 depends on R\ge1.1.1.
Installation
-
‘configure’ makes use of
HAVE_F77_UNDERSCOREin ‘Rconfig.h’. -
PKG_LIBSandPKG_LDFLAGSto the configured values ofLIBSandLDFLAGSin ‘src/Makevars.in’.
Changes in version 0.3-5 (2000-08-20)
Deprecated and Defunct
-
eigen.Matrixargumentschur, which was unused, is removed.
Methods
An S3 method
schur.Matrixinterfacing LAPACK routinedgeesx. It returnslist(values, schur, vectors).For arguments not inheriting from
MatrixsubclassHermitian,eigen.Matrixis now an interface to LAPACK routinedgeevx, and its optional argumentsbalanceandrcond, which were unused, can now be used to request balancing and the reciprocal condition numbers of the eigenvalues and right eigenvectors. The return value is nowlist(values, vectors, rcond)withvectors = list(left, right)andrcond = list(values, vectors).
Changes in version 0.3-3 (2000-08-11)
Installation
-
‘configure’ skips the check for BLAS in the Sun Performance Library if the C compiler is
gcc.
Compatibility
-
STRING_ELT,SET_STRING_ELT,VECTOR_ELT, andSET_VECTOR_ELTare used in place ofSTRINGandVECTOR.*_ELTmacros are defined for R<1.2.0 to not break compatibility.
Significant User-Visible Changes
-
SVD(x, nu = 0, nv)$uandSVD(x, nu, nv = 0)$vtareNULLrather than empty matrices.
Methods
An S3 method
lu.Matrixinterfacing LAPACK routinedgetrf. It returnslist(l, u, permutation), with attributenorms = list(one, infinity)containing the one and infinity norms. An optional argument is provided to disable computation ofoneandinfinity.
Bug Fixes
-
SVD(x, nu, nv)allocated for the right singular values a matrix with dimensionsc(ncol(x), nv)instead ofc(nv, ncol(x)). Buffer overflow could occur in LAPACK routinedgesvdifnv < ncol(x).
Changes in version 0.3-1 (2000-07-24)
Generic Functions
S3 generic function
eigen.
Methods
An S3 method
eigen.Matrixinterfacing LAPACK routinesdgeevanddsyev, the latter only for arguments inheriting fromMatrixsubclassHermitian. It returnslist(values, vectors), wherevectorsislist(left, right)for non-Hermitianarguments and a numeric matrix forHermitianarguments. An optional argument is provided to disable computation ofvectors.S3 methods
det.Matrix,det.UpperTriangular,det.UnitUpperTriangular,det.LowerTriangular, anddet.UnitLowerTriangularcomputing the modulus of the determinant or its logarithm. These returnlist(modulus, sign). Componentmodulushas a logical attributelogarithmindicating if the determinant issign * exp(modulus)orsign * modulus.det.Matrixcomputes theQRfactorization of its argument using LAPACK routinedgeqrf.
Bug Fixes
-
Matrix.class(x)could be incomplete or contain bad elements for orthogonalx.
New Features
A function
as.Matrixfor coercing an object to classMatrix, parallel toas.matrix. The return value inherits from subclasses ofMatrixif tests for structure are satisfied.Functions
asObjectandprependClassfor setting and prepending to theclassattribute of the argument.A function
diagDetfor computing the determinant of a triangular matrix given the diagonal entries.
Changes in version 0.2-4 (2000-07-18)
Installation
A ‘configure’ script detecting options for linking BLAS and LAPACK. It is generated from ‘configure.in’ which makes use of an Autoconf macro
OCTAVE_BLAS_LIBSdefined in ‘aclocal.m4’.-
‘src/Makevars’ is now generated from ‘src/Makevars.in’.
A ‘cleanup’ script removing generated files.
Documentation
A Texinfo manual ‘R-Matrix.texi’ containing implementation details and describing how LAPACK++ was modified for Matrix.
Methods
An S3 method
rcond.Matrixinterfacing LAPACK routinesd*con.
Bug Fixes
Exceptions thrown by LAPACK++ are caught and handled as R errors.
-
UpperTriangular.testandLowerTriangular.testreturned a maximum rather than a maximum modulus for real arguments.
Changes in version 0.2-1 (2000-07-15)
Description
-
Matrix version 0.2-1 is the first one to be distributed by CRAN.
The package is titled “A Matrix Library for R”.
Douglas Bates is the maintainer and principal author. Saikat DebRoy is a co-author.
-
Matrix
\ge0.2-1 depends on R\ge1.1.0.
Installation
A modified LAPACK++ (Linear Algebra PACKage in C++, version 1.1a) is compiled alongside the Matrix sources. LAPACK++ is a C++ interface to LAPACK originally developed by Roldan Pozo.
Classes
S3 class
Matrixwith subclassesHermitian,UpperTriangular(recursively,UnitUpperTriangular), andLowerTriangular(recursively,UnitLowerTriangular). Objects are traditional numeric matrices with aclassattribute indicating their structural properties. Objects are interfaced in C++ using the parallel class hierarchy defined by LAPACK++.
Generic Functions
S3 generic functions
det,expand,facmul,lu,norm,rcond,schur, andunpack.
Methods
An S3 method
norm.Matrixinterfacing LAPACK routinesdlan*.An S3 method
solve.Matrixinterfacing LAPACK routinesd*trfandd*trs.An S3 method
as.matrix.Matrixjust dropping the class attribute.An S3 method
print.Matrixjust printing theas.matrixresult.
New Features
A function
Matrixconstructing objects of classMatrixfrom numeric vectors and matrices, parallel to base functionmatrix.A function
Matrix.classreturning a character vector containing the subclasses ofMatrixthat would be valid for the argument.Functions
Hermitian.test,UpperTriangular.test,LowerTriangular.test,Orthogonal.test, andOrthonormal.testreturning a maximum modulus distance useful for testing the respective property.Functions
is.Hermitian,is.UpperTriangular,is.LowerTriangular, andis.Orthonormaltesting if the*.testvalue does not exceed a tolerance.Function
SVDinterfacing LAPACK routinedgesvd.SVD(x, nu, nv)returnslist(d, u, vt)containing the singular values (sorted non-increasingly), firstnuleft singular vectors (stored column-wise), and firstnvright singular vectors (stored row-wise).Function
hilbertconstructing then-by-nHilbert matrix.