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

Eri*_*ski 47 matrix octave

在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
Run Code Online (Sandbox Code Playgroud)

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

por*_*ors 64

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

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

mymatrix(2:end,:)  % all but first row
Run Code Online (Sandbox Code Playgroud)

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

  • 干净多了:D (2认同)

Her*_*utt 56

GNU Octave从Matrix中删除第2列和第4列

mymatrix = eye(5); 
mymatrix(:,[2,4]) = []; 
disp(mymatrix)
Run Code Online (Sandbox Code Playgroud)

打印:

1   0   0
0   0   0
0   1   0
0   0   0
0   0   1
Run Code Online (Sandbox Code Playgroud)

GNU Octave删除Matrix中的第2行和第4行:

mymatrix = eye(5); 
mymatrix([2,4],:) = [];
disp(mymatrix) 
Run Code Online (Sandbox Code Playgroud)

打印:

1   0   0   0   0
0   0   1   0   0
0   0   0   0   1
Run Code Online (Sandbox Code Playgroud)

时间复杂

GNU Octave用于切片和广播的CPU复杂度是一个快速的线性时间O(n * c),其中n是行数,而ca是保留的常数行数.它是C级单核矢量化但不是并行的.

内存复杂性

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

唯一的时间速度将是一个问题是,如果你的矩阵是不切实际的宽,高,或有多个尺寸,吹掉你的快速内存,速度受磁盘和内存之间的传输速度限制.


the*_*uri 12

这样做的相反方法:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 8

如何删除八度中的多个列:

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

columns_to_remove = [2 4];
matrix(:,columns_to_remove)=[]
Run Code Online (Sandbox Code Playgroud)

图说:

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 
Run Code Online (Sandbox Code Playgroud)