在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列,这让我头疼。必须有更好的方法!
答案 0 :(得分:60)
如果您不知道确切的列数或行数,可以使用魔术“结束”索引,例如:
mymatrix(2:end,:) % all but first row
这也允许您从矩阵中切割行或列,而无需将其重新分配给新变量。
答案 1 :(得分:56)
GNU Octave删除Matrix中的第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复制了两个对象,遍历每个元素,然后删除原始内容。
唯一的时间速度是一个问题,如果你的矩阵是不切实际的宽,高,或有多个维度,吹掉你的快速内存,速度受磁盘和内存之间的传输速度限制。
答案 2 :(得分:12)
执行此操作的相反方法:
columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
答案 3 :(得分:8)
如何删除第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