2009-08-07 75 views
11

好吧,想象一下我有这个矩阵:{{1,2},{2,3}},我宁愿有{{4,1,2},{5,2,3}}。也就是说,我在矩阵中添加了一列。有没有简单的方法来做到这一点?如何在矩阵上添加一列?

我最好的建议是这样的:

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

但它混淆了代码和不断需要装载更多的代码。这不是以某种方式建立的吗?

回答

11

由于ArrayFlatten在数学6引入了至少混淆的解决方案必须是

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

[email protected]{{vector, matrix}} 

一个好的技巧是用0替换任何矩阵块给你一个正确大小的零块。

7

我认为至少是晦涩这样做的以下方式:

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

一般来说,MapThread是你最经常使用的任务,像这样的功能(我用它所有的在将这些标签添加到数组之前,将它们很好地与Grid合并在一起),它可以使事情更清晰,更简洁,使用Prepend而不是等效的Prepend[#1, #2]&

7

我相信最常见的方式是转置,前置,并再次转:

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

THE ... ABSOLUTELY .. BY FAR ...最快的方法来追加或预先列从我的各种方法的测试列RandomReal[100,{10^8,5}](孩子们,不要在家里尝试...如果您的机器isn不是为速度和内存而设计的,在这个尺寸的阵列上的操作可以保证你的电脑挂起) ...是这样的:Append[tmp\[Transpose], [email protected]@tmp]\[Transpose]。 随意替换AppendPrepend

下一个最快的是这个:Table[tmp[[n]]~Join~{n}, {n, [email protected]}] - 几乎是两倍慢。

+4

显然你错过了http://stackoverflow.com/questions/4270802/inserting-into-a-2d-list/4270825#4270825中的答案。使用'ArrayFlatten'似乎更快。 – 2011-09-25 18:39:47