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.
Answer
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.
Comments
Post a Comment