在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)
这也允许您从矩阵中切割行或列,而无需将其重新分配给新变量.
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)
如何删除第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)