【发布时间】:2011-11-24 03:25:53
【问题描述】:
我认为 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
但是要插入一列,经过一番挣扎,我找到了2种方法,我在下面展示,想问问这里的专家他们是否看到了更短更直接的方法(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
【问题讨论】:
-
@WReach 您链接的问题的表述有点狭隘,要求在最后添加列(尽管有些解决方案更通用,也适合这个问题)。跨度>
-
This 问题也类似。 There Janus 提请注意通过
ArrayFlatten方法插入一列零(例如)的“技巧”,如下所示:ArrayFlatten@{{a[[All, ;; 1]], 0, a[[All, 2 ;; 3]]}}(在我看来,recent question 已被处理得更多比这个更严厉的是“可能的重复”) -
@TomD 我认为问题没有得到平等对待的一个原因是更多的人意识到前一个问题是重复的(例如,我不知道这个问题的主题之前讨论过在如此相似的环境中,当然 Sjoerd 也没有)。那是因为最近有很多人(包括我自己)加入了 mma SO 标签。 OTOH,一旦问题获得动力(答案、投票、cmets 等),它就会开始自己的生命,而结束可能不再是一个好的选择。