web-dev-qa-db-ja.com

Matlabで(特定のパターンではなく)サブマトリックスを選択する方法

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

役に立つ回答をありがとう!

17
v32

TLDR:ショートアンサー

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

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


MATLABでのインデックス作成

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

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]
_

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

  • 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]
_

したがって、bは40に等しくなります。

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

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

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

3.論理インデックス

論理インデックスでは、添え字はバイナリであり、論理_1_は対応する要素が選択されていることを示し、_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 を使用して)行列に戻す必要があります。

40
Eitan T

例で説明しましょう:

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

お役に立てれば。

13
R. Schifini
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 th行とj th列を削除して、マトリックスAを返します。

0
Cameron