从 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 中的矩阵中删除一列的主要内容,如果未能解决你的问题,请参考以下文章