Row vectors and column vectors (Mathematica vs Matlab)

As far as I know, Mathematica does not distinguish between row vectors and column vectors: all vectors are seen as lists. I know ways to bypass this as suggested here Product between a column vector and a row vector - error and get Matlab-style matrix multiplication.

My question is why Mathematica and Matlab behaves differently in this context? I have seen a clear explanation in https://groups.google.com/forum/#!forum/comp.soft-sys.math.mathematica several years ago but I cannot recall it anymore.

I guess it has to do with something fundamental.

• It's not so much that Mathematica doesn't distinguish between row and column vectors: it's more that it has a clear concept of tensors of arbitrary rank (something Matlab didn't really have last time I checked). A column vector is just a n x 1 matrix and there's nothing stopping you from using n x 1 matrices. But you don't have to if you don't want to. A normal list is just a rank 1 tensor. The documentation of Dot, for example, states that Dot contracts the innermost indices of two tensors. It doesn't matter what order of tensor you're using. – Sjoerd Smit May 8 at 18:35
• As in a slightly different way expressed by @Szabolcs as well, row and column vectors are not vectors themselves. They are only two different notations for the same vector. A vector cannot be transposed, a matrix can. Transposing a row or column vector is just switching from row notation to column notation or conversely. In Mathematica, this is completely superfluous. – Fred Simons May 8 at 18:52

This is a limitation of MATLAB, as MATLAB is only able to work with matrices. It does not have true vectors. It cannot even represent a character array as a 1D array or a structure array as a single element—it always must be 2D.

Mathematica takes a much more general view. It works with arbitrary, $$n$$-index tensors. A 1-index tensor is called a vector. A 2-index one is called a matrix.

What is commonly called a "row vector" or a "column vector" is not really a vector. It is a $$1\times k$$ or a $$k \times 1$$ matrix.

The dot product of a vector $$v$$ and a matrix $$a$$ is $$u_j = \sum_i v_i a_{ij}$$

The product of $$a$$ and $$v$$ is $$u_i = \sum_j a_{ij} v_j$$

In general, one can contract any two indices together, although Dot specifically only contracts the last one of the first tensor with the first one of the last tensor. TensorContract can do more general operations.

One particular limitation of Mathematica compared to MATLAB is that Mathematica cannot represent arrays where one of the dimensions is 0, e.g. a 0-by-n matrix. This is not due to the difference in philosophy that I described above. It's because Mathematca uses nested lists, so we can have a 1-by-0 {} but not a 0-by-1 thing.

• I disagree that Matlab doesn't do 1D arrays — in fact I think it would be more correct to say that ALL Matlab arrays are 1D with an N-D size index as part of data structure. For instance, you can write x=1:1000000; which is 1D and then xx=reshape(x,[10 10 10 10 10 10]); which is very very fast, to turn it into a 6D array. And contents in all Matlab arrays can be indexed with a unity-length index. So xx(600) is the same as x(600) in the example I just mentioned. – Will Robertson May 9 at 4:02
• @WillRobertson The fact that it's possible to do a 1D indexing has no bearing on how these quantities are treated during matrix multiplication. Also, while it can indeed handle higher dimensional arrays, the C APIs don't accept setting the dimension to 1. The minimum is 2. It's clear that MATLAB was designed with matrices and only matrices in mind, to the extent that even a char, cell or struct is a two-index quantity. – Szabolcs May 9 at 6:44
• Fair enough. I see what you mean in that a vector of length N is not (conceptually) the same as a matrix of length 1xN or Nx1. And that the internal data structure is not the same as the mathematical meaning. – Will Robertson May 11 at 5:34