从 GNU Octave 中的矩阵中删除一列

Posted

技术标签:

【中文标题】从 GNU Octave 中的矩阵中删除一列【英文标题】:Remove a column from a matrix in GNU Octave 【发布时间】:2012-09-05 14:32:25 【问题描述】:

在 GNU Octave 中,我希望能够从矩阵中删除特定列。为了一般性。我还希望能够从矩阵中删除特定行。

假设我有这个:

mymatrix = eye(5)

mymatrix =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1

我想删除第 2 列和第 4 列,但是当我删除第 2 列时,第 4 列的位置已经移动到第 3 列,这让我很头疼。必须有更好的方法!

【问题讨论】:

【参考方案1】:

如果您不知道确切的列数或行数,您可以使用神奇的“结束”索引,例如:

mymatrix(:,2:end)  % all but first column

mymatrix(2:end,:)  % all but first row

这还允许您从矩阵中切出行或列,而无需将其重新分配给新变量。

【讨论】:

干净多了:D 正是我想要的!【参考方案2】:

GNU Octave 从矩阵中删除第 2 列和第 4 列

mymatrix = eye(5); 
mymatrix(:,[2,4]) = []; 
disp(mymatrix)

打印:

1   0   0
0   0   0
0   1   0
0   0   0
0   0   1

GNU Octave 从矩阵中删除第 2 行和第 4 行:

mymatrix = eye(5); 
mymatrix([2,4],:) = [];
disp(mymatrix) 

打印:

1   0   0   0   0
0   0   1   0   0
0   0   0   0   1

时间复杂度

此处用于切片和广播的 GNU Octave 的 CPU 复杂度是快速线性时间O(n * c) 其中 n 是行数,c 是剩余的恒定行数。它是 C 级单核矢量化但不是并行的。

内存复杂度

工作内存的复杂性是线性的:O(n * 2) C 复制两个对象,遍历每个元素,然后删除原始元素。

唯一会成为问题的时间是,如果您的矩阵太宽、太高,或者有许多维度会耗尽您的快速内存,并且速度受到磁盘和内存之间的传输速度的限制。

【讨论】:

【参考方案3】:

执行此操作的相反方法:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)

【讨论】:

【参考方案4】:

如何去除八度音阶中的多列:

如何删除第 2 列和第 4 列:

columns_to_remove = [2 4];
matrix(:,columns_to_remove)=[]

图解:

mymatrix = eye(5)
mymatrix =

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1



columns_to_remove = [2 4];

mymatrix(:,columns_to_remove)=[]


mymatrix =

   1   0   0
   0   0   0
   0   1   0
   0   0   0
   0   0   1 

【讨论】:

以上是关于从 GNU Octave 中的矩阵中删除一列的主要内容,如果未能解决你的问题,请参考以下文章

在 Octave 中保存/加载大型矩阵

如何在 C/C++ 程序中嵌入 GNU Octave?

Octave中的矩阵操作

在 Octave 中构造一个矩阵

吴恩达机器学习私人总结

Coursera在线学习---第二节.Octave学习