On Wed, 24 Dec 2014, Bert Gunter wrote:

You are again misinterpreting because you have not read the docs, although this time I will grant that they are to some extent misleading.

First of all, a matrix _IS_ a vector:

a <- matrix(1:4, 2,2)
a[3] ## vector indexing works because it is a vector
[1] 3

In fact, a matrix (or array) is a vector with a "dim" attribute. This
is documented in ?matrix:

"is.matrix returns TRUE if x is a vector and has a "dim" attribute of
length 2) and FALSE otherwise."

But a vector has no such attribute, so a matrix is not a vector which is why you see this:

a <- matrix(1:4, 2,2)
is.vector(a)
[1] FALSE

Of course the matrix can be coerced back into a vector just as the vector was coerced into a matrix:

b <- as.vector(a)
is.vector(b)
[1] TRUE


Your confusion arises because, despite its name, is.vector() does not actually test whether something "is" a vector (after all these are all abstractions; what it "is" is contents of memory, implemented as a linked list or some such). ?is.vector tells you:

"is.vector returns TRUE if x is a vector of the specified mode having
no attributes other than names. It returns FALSE otherwise."

So that means that a vector in R has no attributes other than names.


An array has a "dim" attribute, so is.vector() returns FALSE on it. But it actually _is_ ("behaves like") a vector (in column major order,actually).

An array is a vector with additional attributes which cause it to be an array rather than a vector. This is why R says FALSE when we query it about an array using is.vector().


Now you may complain that this is confusing and I would agree. Why is it this way? I dunno -- probably due to historical quirks -- evolution is not necessarily orderly. But that's the way it is; that's the way it's documented; and tutorials will tell you about this (that's how I learned). So please stop guessing and intuiting and read the docs to understand how things work.

I don't think it is confusing. This is the kind of behavior I'm used to from other programs like Octave/MATLAB. A vector is just an ordered list of numbers. Those numbers can be put into matrices or higher-dimensional arrays, but they then become something more than just a vector. A vector like 1:4 becomes a 2x2 matrix when we do matrix(1:4, 2,2) such that the number 3 which was just the third element before (and still is) is now also the [1,2] element of a matrix. It didn't have that before, back when it was a vector, but now that it has become something more than a vector, it has that new property. We can take that away using as.vector().

In many situations the behavior of the R vector and the same values in a matrix format will be very different:

a <- 1:4
b <- matrix(a, 2,2)
a %*% a
     [,1]
[1,]   30
b %*% b
     [,1] [,2]
[1,]    7   15
[2,]   10   22
b %*% t(b)
     [,1] [,2]
[1,]   10   14
[2,]   14   20
a %*% t(a)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    2    4    6    8
[3,]    3    6    9   12
[4,]    4    8   12   16

That is not true in ave(), as I showed earlier, because it uses the vector ordering of elements in the x matrix or array (what one would get from as.vector()) to form the correspondence with the factor.

I get your idea, but I don't think it is correct to say "a matrix is a vector." Rather, I would say that there is a standard way in which one can create a one-to-one correspondence between the elements of a matrix of given dimensions and the elements of a vector. I believe this is usually called "fortran indexing," or at least that is what it is called in Octave. The same thing is done with vectorization and the vec() operator in mathematics:

http://en.wikipedia.org/wiki/Vectorization_(mathematics)

But in math as in computing, we wouldn't say that a matrix *is* a vector. If vec(A) = v, that does not mean that A = v. In R, it looks like as.vector() can do what vec() does, and more.

Mike

--
Michael B. Miller, Ph.D.
University of Minnesota
http://scholar.google.com/citations?user=EV_phq4AAAAJ

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to