55

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列目に移動し、頭が痛くなります。より良い方法が必要です!

4

4 に答える 4

77

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

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

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

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

于 2014-11-12T15:00:05.693 に答える
62

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

時間の複雑さ

ここでのスライスとブロードキャストに関するGNUOctaveのCPUの複雑さは、高速の線形時間ですO(n * c)。ここで、nは行数であり、caは残りの行数です。これは、経営幹部レベルのシングルコアベクトル化されていますが、並列ではありません。

メモリの複雑さ

ワーキングメモリの複雑さは直線的ですO(n * 2)。Cは2つのオブジェクトのクローンを作成し、すべての要素を繰り返し処理してから、元のオブジェクトを削除します。

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

于 2012-09-12T14:27:30.503 に答える
14

これを行う逆の方法:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
于 2013-11-25T11:37:22.957 に答える
9

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

列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 
于 2012-09-12T14:29:36.463 に答える