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列目に移動し、頭が痛くなっています。より良い方法が必要です!
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つのオブジェクトのクローンを作成し、すべての要素を反復処理してから、元の要素を削除します。
唯一の時間の速度が問題になるのは、マトリックスが非現実的に幅が広く、背が高い場合、または高速メモリを使い果たす多くの次元がある場合で、速度はディスクとメモリ間の転送速度によって制限されます。
列または行の正確な数がわからない場合は、魔法の「終了」インデックスを使用できます。例:
mymatrix(:,2:end) % all but first column
mymatrix(2:end,:) % all but first row
これにより、新しい変数に再割り当てすることなく、行列から行または列をスライスすることもできます。
これを行う逆の方法:
columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
列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