Re: Scalars Instead of Lists with One Element
- To: mathgroup at smc.vnet.net
- Subject: [mg83565] Re: Scalars Instead of Lists with One Element
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Fri, 23 Nov 2007 05:29:10 -0500 (EST)
- References: <fhu75c$72j$1@smc.vnet.net> <4742F294.5050606@gmail.com> <fi3jfv$b34$1@smc.vnet.net>
Gregory Lypny wrote: > Thanks everyone for your insights, > > I've found the problem. Say you want to sum a list whose elements are > 13 and 9. Mathematica will return a list with one element, {22}, > rather than 22 if the original list is specified as a 2x1 column vector. > > x = {{13}, {9}}; y = Total@x >>> returns {22} > > This also happens if you write x as I have above, or you use > Mathematica's Insert menu to create a more visually appealing column > vector, Tip: Use CTRL+Enter and CTRL+, instead of the insert menu. > but it does not happen if you define x as a 2x1 array using > the Array command. Yes, it does: In[1]:= Array[# &, {2, 1}] Out[1]= {{1}, {2}} In[2]:= Total[%] Out[2]= {3} > > I think it will happen with any matrix calculation whose result should > otherwise be a scalar. If we now let y be the row vector {1, 1} then > > y.x >>> returns {22} > This is because Mathematica works with tensors of arbitrary dimensions, not just matrices or vectors. So in Mathematica it does not make sense to speak about column or row vectors---all vectors (1D arrays) are treated in the same way. {{1},{2}} is a 2 by 1 matrix and {{1, 2}} is a 1 by 2 matrix, not vectors. (Of course all this is just a question of naming conventions. I am just trying to explain why Mathematica works this way.) > The upshot of this is that any table that is created from calculations > that make use of column vectors or matrix math will likely have a > depth greater than 3, and you won't be able to cut and paste directly > into a word processor or spreadsheet. When you multiply a vector with a matrix, you get a vector. If you multiply a vector with a vector, you get a scalar: In[4]:= {x, y}.{{a, b}, {c, d}} Out[4]= {a x + c y, b x + d y} In[5]:= {{a, b}, {c, d}}.{x, y} Out[5]= {a x + b y, c x + d y} In[6]:= {x, y}.{a, b} Out[6]= a x + b y If the distinction between column and row vectors is important, just work with matrices, and you'll always get matrices as the result (no scalars): In[7]:= {{x, y}}.{{a}, {b}} Out[7]= {{a x + b y}} In[8]:= {{a}, {b}}.{{x, y}} Out[8]= {{a x, a y}, {b x, b y}} If it is not important to differentiate between row and column vectors, then use 1D arrays to represent vectors. The Outer product can be calculated like this: In[9]:= Outer[Times, {a, b}, {x, y}] Out[9]= {{a x, a y}, {b x, b y}} > > I'm going to have a look at some of the work-arounds that have been > suggested in this thread and my related thread "Copy and Pasting > Tables into Spreadsheet". > > > Gregory > -- Szabolcs