17

Matlabでサブマトリックス(パターンではない)を選択するには? たとえば、サイズが 10 x 10 の行列の場合、1 番目の 2 番目と 9 番目の行と 4 番目と 6 番目の列の交点で構成される部分行列を選択する方法は?

役立つ回答をありがとうございます。

4

3 に答える 3

42

TLDR: 簡単な回答

あなたの質問については、任意の 10 行 10 列の行列があるとしますA。必要な部分行列を抽出する最も簡単な方法は、インデックス ベクトルを使用することです。

B = A([1 2 9], [4 6]);


MATLAB でのインデックス作成

公式ドキュメントには、MATLAB でのインデックス作成について包括的に説明している興味深い記事があります。基本的に、値のサブセットを抽出するにはいくつかの方法があります。それらを要約します。

1. ベクトルの索引付け

インデックス ベクトルは、抽出する要素のインデックスを示します。次のように、1 つまたは複数のインデックスを含めることができます。

A = [10 20 30 40 50 60 70 80 90]

%# Extracts the third and the ninth element
B = A([3 9])  %# B = [30 90]

インデックス ベクトルは、次元ごとに個別に指定できます。たとえば、次のようになります。

A = [10 20 30; 40 50 60; 70 80 90];

%# Extract the first and third rows, and the first and second columns
B = A([1 3], [1 2])  %# B = [10 30; 40 60]

2 つの特別な添え字もあります:endとコロン ( :):

  • endその次元の最後のインデックスを示すだけです。
  • コロンは、「1:end」の略記です。

たとえば、 と書く代わりに、 と書くA([1 2 3], [2 3])ことができますA(:, 2:end)。これは、大きな行列の場合に特に便利です。

2. 線形索引付け

線形インデックスは、列を 1 つの列ベクトルに連結し、それぞれの要素にインデックスを割り当てることにより、行列を列ベクトルであるかのように扱います。たとえば、次のようなものがあります。

A = [10 20 30; 40 50 60; 70 80 90];

を計算したいb = A(2)。同等の列ベクトルは次のとおりです。

A = [10;
     40;
     70;
     20;
     50;
     80;
     30;
     60;
     90]

したがって、b40 に等しくなります。

もちろん、特殊なコロンとend添え字も使用できます。そのため、A(:)任意の行列Aを列ベクトルに変換します。

行列添字による線形索引付け: 線形索引付けに別の行列を使用することもできます。添字行列は単純に列ベクトルに変換され、線形インデックス付けに使用されます。ただし、結果の行列は常に添字行列と同じ次元になります。
たとえば、 if I = [1 3; 1 2]、 thenA(I)は書き込みと同じreshape(A(I(:)), size(I))です。

行列添字から線形インデックスへの変換、およびその逆の変換: そのためには、それぞれ と がsub2indありind2subます。たとえば、[1, 3]行列の添字A(要素 30 に対応) を線形インデックスに変換する場合は、次のように記述できますsub2ind(size(A), 1, 3)(この場合の結果はもちろん 7 になるはずです)。

3. 論理インデックス

論理インデックスでは、添字は 2 進数であり、logical1は対応する要素が選択されていることを示し、選択され0ていないことを意味します。添え字ベクトルは、元の行列と同じ次元か、同じ要素数のベクトルでなければなりません。たとえば、次の場合:

A = [10 20 30; 40 50 60; 70 80 90];

論理インデックスを使用して抽出したいA([1 3], [1 2])場合は、次のいずれかを実行できます。

Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)

またはこれ:

I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)

またはこれ:

I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)

後者の 2 つのケースでは、 は 1 次元のベクトルであり、必要に応じて (たとえば、 を使用してreshape) 行列に再形成する必要があることに注意してください。

于 2012-10-26T19:31:43.427 に答える
13

例を挙げて説明しましょう。

6x6マトリックスを定義しましょう

A = magic(6)

A = 
35     1     6    26    19    24
 3    32     7    21    23    25
31     9     2    22    27    20
 8    28    33    17    10    15
30     5    34    12    14    16
 4    36    29    13    18    11

このマトリックスから、行1、2、5、および列4と6の要素が必要です。

B = A([1 2 5],[4 6])

B = 

26    24
21    25
12    16

お役に立てれば。

于 2012-10-26T17:21:22.063 に答える
0
function f = sub(A,i,j)
[m,n] = size(A);

row = 1:m;
col = 1:n;

x = row;
x(i) = [];

y=col;
y(j) = [];

f= A(x,y);

i番目の行と j番目の列が削除された行列 A を返します。

于 2016-07-04T22:20:04.070 に答える