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

55
在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列,这让我很头疼。一定有更好的方法!

4个回答

77

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

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

mymatrix(2:end,:)  % all but first row
这还可以让你在不必将其重新分配到新变量的情况下从矩阵中切片行或列。

2
非常干净:D - Kaolin Fire
正是我所寻找的! - Vivek Shankar

63

如何从矩阵中删除第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

如何从矩阵中删除第二行和第四行:

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克隆了两个对象,遍历每个元素,然后删除原始对象。

唯一需要考虑速度的情况是如果矩阵非常宽、高,或者拥有爆炸式维度,会导致快速内存被占满,速度受到磁盘和内存之间传输速度的限制。


14

实现相反的方法:

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

9

如何在Octave中删除多个列:

如何删除第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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接