好的,假设我有这个矩阵:{{1,2},{2,3}},我宁愿有 {{4,1,2},{5,2,3}}。也就是说,我在矩阵中添加了一列。有没有简单的方法来做到这一点?
我最好的建议是这样的:
PrependColumn[vector_List, matrix_List] :=
Outer[Prepend[#1, #2] &, matrix, vector, 1]
但它混淆了代码,并且不断需要加载越来越多的代码。这不是以某种方式内置的吗?
好的,假设我有这个矩阵:{{1,2},{2,3}},我宁愿有 {{4,1,2},{5,2,3}}。也就是说,我在矩阵中添加了一列。有没有简单的方法来做到这一点?
我最好的建议是这样的:
PrependColumn[vector_List, matrix_List] :=
Outer[Prepend[#1, #2] &, matrix, vector, 1]
但它混淆了代码,并且不断需要加载越来越多的代码。这不是以某种方式内置的吗?
由于ArrayFlatten
在 Mathematica 6 中引入了最少混淆的解决方案,因此必须是
matrix = {{1, 2}, {2, 3}}
vector = {{4}, {5}}
ArrayFlatten@{{vector, matrix}}
一个不错的技巧是用任何矩阵块替换0
为您提供大小合适的零块。
我认为最不模糊的是以下方法:
PrependColumn[vector_List, matrix_List] := MapThread[Prepend, {matrix, vector}];
一般来说,MapThread
这是您最常用于此类任务的函数(我一直在向数组添加标签时使用它,然后用 很好地格式化它们Grid
),它可以使事情变得更清晰、更简洁Prepend
而不是等价的Prepend[#1, #2]&
.
我相信最常见的方法是转置、前置和再次转置:
PrependColumn[vector_List, matrix_List] :=
Transpose[Prepend[Transpose[matrix], vector]]
......绝对......到目前为止......从我对数组的各种方法的测试中附加或预先添加一列的最快方法RandomReal[100,{10^8,5}]
(孩子们,不要在家里尝试这个......如果你的机器不是为了速度而建造的和内存,对这个大小的数组的操作保证会挂起你的计算机)......这是:Append[tmp\[Transpose], Range@Length@tmp]\[Transpose]
. 随意更换Append
。Prepend
下一个最快的事情是:Table[tmp[[n]]~Join~{n}, {n, Length@tmp}]
- 几乎慢了两倍。