web-dev-qa-db-ja.com

GNU 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

2列目と4列目を削除したいのですが、2列目を削除すると、4列目の位置が3列目に移動し、頭が痛くなっています。より良い方法が必要です!

47
Eric Leschinski

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は、2つのオブジェクトのクローンを作成し、すべての要素を反復処理してから、元の要素を削除します。

唯一の時間の速度が問題になるのは、マトリックスが非現実的に幅が広く、背が高い場合、または高速メモリを使い果たす多くの次元がある場合で、速度はディスクとメモリ間の転送速度によって制限されます。

56
HerrKaputt

列または行の正確な数がわからない場合は、魔法の「終了」インデックスを使用できます。例:

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

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

これにより、新しい変数に再割り当てすることなく、行列から行または列をスライスすることもできます。

63
pors

これを行う逆の方法:

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

オクターブで複数の列を削除する方法:

列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 
8
Eric Leschinski