gpt4 book ai didi

wolfram-mathematica - 如何在矩阵中插入一列,正确的 Mathematica 方式

转载 作者:行者123 更新时间:2023-12-03 11:35:57 30 4
gpt4 key购买 nike

我认为 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

最佳答案

您的双 Transpose方法看起来不错。对于非常大的矩阵,这将快 2-3 倍:

MapThread[Insert, {a, column, Table[2, {Length[column]}]}]

如果你想模仿你的 Matlab 方式,最接近的可能是这样的:
ArrayFlatten[{{a[[All, ;; 1]], Transpose[{column}], a[[All, 2 ;;]]}}]

请记住,插入需要制作矩阵的完整副本。因此,如果您打算以这种方式构建矩阵,则预分配矩阵(如果您知道其大小)并通过 Part 进行就地修改会更有效。反而。

关于wolfram-mathematica - 如何在矩阵中插入一列,正确的 Mathematica 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537401/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com