How to prepend a column to a matrix?

2019-01-17 23:37发布

问题:

Ok, imagine I have this Matrix: {{1,2},{2,3}}, and I'd rather have {{4,1,2},{5,2,3}}. That is, I prepended a column to the matrix. Is there an easy way to do it?

My best proposal is this:

PrependColumn[vector_List, matrix_List] := 
 Outer[Prepend[#1, #2] &, matrix, vector, 1]

But it obfuscates the code and constantly requires loading more and more code. Isn't this built in somehow?

回答1:

Since ArrayFlatten was introduced in Mathematica 6 the least obfuscated solution must be

matrix = {{1, 2}, {2, 3}}
vector = {{4}, {5}}

ArrayFlatten@{{vector, matrix}}

A nice trick is that replacing any matrix block with 0 gives you a zero block of the right size.



回答2:

I believe the most common way is to transpose, prepend, and transpose again:

PrependColumn[vector_List, matrix_List] := 
  Transpose[Prepend[Transpose[matrix], vector]]


回答3:

I think the least obscure is the following way of doing this is:

PrependColumn[vector_List, matrix_List] := MapThread[Prepend, {matrix, vector}];

In general, MapThread is the function that you'll use most often for tasks like this one (I use it all the time when adding labels to arrays before formating them nicely with Grid), and it can make things a lot clearer and more concise to use Prepend instead of the equivalent Prepend[#1, #2]&.



回答4:

THE... ABSOLUTELY.. BY FAR... FASTEST method to append or prepend a column from my tests of various methods on array RandomReal[100,{10^8,5}] (kids, don't try this at home... if your machine isn't built for speed and memory, operations on an array this size are guaranteed to hang your computer) ...is this: Append[tmp\[Transpose], Range@Length@tmp]\[Transpose]. Replace Append with Prepend at will.

The next fastest thing is this: Table[tmp[[n]]~Join~{n}, {n, Length@tmp}] - almost twice as slow.