我认为Mathematica更倾向于行而非列。
给定一个矩阵,在其中插入一行似乎很容易,只需使用Insert[]
。
(a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}) // MatrixForm
1 2 3
4 0 8
7 8 0
row = {97, 98, 99};
(newa = Insert[a, row, 2]) // MatrixForm
1 2 3
97 98 99
4 0 8
7 8 0
但是,经过一番努力,我找到了两种方法来插入列,我在下面展示,并希望在这里问问专家们是否看到更短、更直接的方式(Mathematica有很多命令,我可能忽略了一个更简单的做法),因为我认为现在的方法对于这样一个基本操作来说还是太复杂了。
第一种方法
必须进行双重转置:
a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}
column = {97, 98, 99}
newa = Transpose[Insert[Transpose[a], column, 2]]
1 97 2 3
4 98 0 8
7 99 8 0
第二种方法
使用SparseArray,但需要注意索引位置。有点笨拙,用于执行以下操作:
(SparseArray[{{i_, j_} :> column[[i]] /; j == 2, {i_, j_} :> a[[i, j]] /; j == 1,
{i_, j_} :> a[[i, j - 1]] /; j > 1}, {3, 4}]) // Normal
1 97 2 3
4 98 0 8
7 99 8 0
问题是:是否有一种更加函数化的方式,比上面的方法更短?当然我可以使用上述之一,并用一个函数将整个过程包装起来,例如insertColumn[...]
,以便于使用。但我想知道是否有比我现在做的更简单的方法。供参考,以下是我在Matlab中执行此操作的方式:
EDU>> A=[1 2 3;4 0 8;7 8 0]
A =
1 2 3
4 0 8
7 8 0
EDU>> column=[97 98 99]';
EDU>> B=[A(:,1) column A(:,2:end)]
B =
1 97 2 3
4 98 0 8
7 99 8 0
ArrayFlatten
方法插入一列零(例如)的“技巧”:ArrayFlatten@{{a[[All, ;; 1]], 0, a[[All, 2 ;; 3]]}}
(在我看来,一个最近的问题被视为“可能的重复项”,受到了比这个问题更严厉的对待)。 - 681234