You have written a lot, Mike, as though we did not know it. You are not the only one with math and multiple computing languages under your belt. The point Bert made is that the concept that a matrix IS-A vector is not just an implementation detail in R... it helps the practitioner keep straight why things like a[3] is perfectly valid when a is a matrix, and why
a*a [,1] [,2] [1,] 1 9 [2,] 4 16 is true. I understand why you are uncomfortable with it, as I was once, but this is how R works so you are only impeding your own effectiveness by clinging to theory on this point. --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity. On December 24, 2014 11:15:28 PM PST, Mike Miller <mbmille...@gmail.com> wrote: >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 ______________________________________________ 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.