[R] cbind in a loop...better way?
Evan Cooch
evan.cooch at gmail.com
Wed Oct 8 21:12:48 CEST 2014
...or some such. I'm trying to work up a function wherein the user
passes a list of matrices to the function, which then (1) takes each
matrix, (2) performs an operation to 'vectorize' the matrix (i.e., given
an (m x n) matrix x, this produces the vector Y of length m*n that
contains the columns of the matrix x, stacked below each other), and
then (3) cbinds them together.
Here is an example using the case where I know how many matrices I need
to cbind together. For this example, 2 square (3x3) matrices:
a <- matrix(c,0,20,50,0.05,0,0,0,0.1,0),3,3,byrow=T)
b <- matrix(c(0,15,45,0.15,0,0,0,0.2,0),3,3,byrow=T)
I want to vec them, and then cbind them together. So,
result <- cbind(matrix(a,nr=9), matrix(b,nr=9))
which yields the following:
[,1] [,2]
[1,] 0.00 0.00
[2,] 0.05 0.15
[3,] 0.00 0.00
[4,] 20.00 15.00
[5,] 0.00 0.00
[6,] 0.10 0.20
[7,] 50.00 45.00
[8,] 0.00 0.00
[9,] 0.00 0.00
Easy enough. But, I want to put it in a function, where the number and
dimensions of the matrices is not specified. Something like
Using matrices (a) and (b) from above, let
env <- list(a,b).
Now, a function (or attempt at same) to perform the desired operations:
vec=function(matlist) {
n_mat=length(matlist);
size_mat=dim(matlist[[1]])[1];
result=cbind()
for (i in 1:n_mat) {
result=cbind(result,matrix(matlist[[i]],nr=size_mat^2))
}
return(result)
}
When I run vec(env), I get the *right answer*, but I am wondering if
there is a *better* way to get there from here than the approach I use
(above). I'm not so much interested in 'computational efficiency' as I
am in stability, and flexibility.
Thanks...
More information about the R-help
mailing list