matindex {lazy.mat} | R Documentation |
Returns the Index to Convert vec(mat) to vec(t(mat)), etc.
matindex( nr, nc, triangle = 0, nodiag = 0, byrow = 0, lowerh = 1, type = 2, print = 0 )
nr |
# of rows. |
nc |
# of columns. |
triangle |
= 1 to roll-out the triangular part. |
nodiag |
= 1 to omit the diagonal elements when triangle = 1. |
byrow |
= 1 to roll-out by row. |
lowerh |
= 0 to roll-out the lower half (lower triangular) part. |
type |
= 1 to output vector index. |
print |
= 1 to print the result. |
Let M
be a matrix and v=vec(M)
or v=vech(M)
.
When type = 2
, the resulting index, idx
, is
a nrow(M) x 2
matrix indicating that
the v[k]
is from M[idx[k,1],idx[k,2]]
.
When type = 1
, the resulting index, idx
, is
a vector of length nrow(M)
indicating that
the v[k]
is from M[idx[k]]
.
In either case, the vectorization can be done as
v <- M[idx]
and the original matrix can be recovered as
M2 <- matrix(NA,nrow(M),ncol(M)) M2[idx] <- v
To convert vec(M)
to vec(t(M))
, use
# vec(t(M)) from vec(M) idx <- matindex(nrow(M), ncol(M), byrow=1, type=1) vectM <- vec(M)[idx] # vec(M) from vec(t(M)) idx <- matindex(ncol(M), nrow(M), byrow=1, type=1) vecM <- vec(t(M))[idx] Print(vec(M),vecM, vec(t(M)), vectM)
(Above is equivalent to old vecindex
now renamed as
vecvecindex
.)
See the examples below and lazy.mat::Kmat
function.
Old functions such as vec, vech, vechinv
can be simulated by using the index from matindex
as follows.
vechindex( M, nodiag=, byrow=, lowerh= ) ---> idx <- matindex( nrow(M), ncol(M), tri=1, nodiag=, byrow=, lowerh= )
(Old functions attach nice names to the output indices, though.)
See the examples below.
A vector or matrix of indices depending on the type
option.
# square matrix nr <- 4; nc <- 4 # entire part idx <- matindex( nr, nc, print=1 ) idx <- matindex( nr, nc, byrow=1, print=1 ) # lower triangular part by column: same as vechindex with byrow=0 idx <- matindex( nr, nc, tri=1, print=1 ) idx <- matindex( nr, nc, tri=1, nodiag=1, print=1 ) # upper triangular part: by column: same as vechindex with byrow=0, lowerh=0 idx <- matindex( nr, nc, tri=1, lowerh=0, print=1 ) idx <- matindex( nr, nc, tri=1, lowerh=0, nodiag=1, print=1 ) # lower triangular part by row: same as vechindex idx <- matindex( nr, nc, tri=1, byrow=1, print=1 ) idx <- matindex( nr, nc, tri=1, nodiag=1, byrow=1, print=1 ) # upper triangular part by row:same as vechindex with lowerh=0 idx <- matindex( nr, nc, tri=1, lowerh=0, byrow=1, print=1 ) idx <- matindex( nr, nc, tri=1, lowerh=0, nodiag=1, byrow=1, print=1 ) # rectangular matrix nr=3; nc=4 # entire part idx <- matindex( nr, nc, print=1 ) idx <- matindex( nr, nc, byrow=1, print=1 ) # lower triangular part: by column idx <- matindex( nr, nc, tri=1, print=1 ) idx <- matindex( nr, nc, tri=1, nodiag=1, print=1 ) # upper triangular part: by column idx <- matindex( nr, nc, tri=1, lowerh=0, print=1 ) idx <- matindex( nr, nc, tri=1, lowerh=0, nodiag=1, print=1 ) # lower triangular part: by row idx <- matindex( nr, nc, tri=1, byrow=1, print=1 ) idx <- matindex( nr, nc, tri=1, nodiag=1, byrow=1, print=1 ) # upper triangular part: by row idx <- matindex( nr, nc, tri=1, lowerh=0, byrow=1, print=1 ) idx <- matindex( nr, nc, tri=1, lowerh=0, nodiag=1, byrow=1, print=1 ) # type=1 and type=2 index idx <- matindex( nr, nc, tri=1, print=1 ) idx <- matindex( nr, nc, tri=1, print=1, type=1 ) Print( vechindex( nr, byrow=0 ) ) # vectorization and recovery of a matrix nr <- 3; nc <- 3 M <- demomat(nr,nc) # using type=2 index idx <- matindex( nr, nc, tri=1, lowerh=1, byrow=0 ) v <- M[idx] M2 <- matrix(NA,nrow(M),ncol(M)) M2[idx] <- v Print(idx,v) Print(M,M2) Print(vech(M,byrow=0), vechinv(vech(M,byrow=0))) # using type=1 index idx <- matindex( nr, nc, tri=1, lowerh=1, byrow=0, type=1 ) v <- M[idx] M2 <- matrix(NA,nrow(M),ncol(M)) M2[idx] <- v Print(idx,v) Print(M,M2) Print(vech(M,byrow=0), vechinv(vech(M,byrow=0))) # conversion between vec(M) and vec(t(M)): same as vecvecindex nr=3; nc=4 M <- demomat(nr,nc) # vec(t(M)) from vec(M) idx1 <- matindex(nr,nc, byrow=1, type=1) vectM <- vec(M)[idx1] # vec(M) from vec(t(M)) idx2 <- matindex(nc,nr, byrow=1, type=1) vecM <- vec(t(M))[idx2] Print(vec(M),vecM, vec(t(M)), vectM) Print(idx1,vecvecindex(nr,nc),idx2,vecvecindex(nc,nr))