(一)初試験Matlab Guiの配列参照


自分の実験
前にMatlabのコードを書いたことがありますが、問題があります.実は私はもう一つのマトリクスBの対応する位置の値を修正したいのですが、位置はAの2要素に対応しています.
これに似ています.
A=[1 1 1 ; 2 2 2 ;  1 2 1];
[x y] = find(A==2);
A(x,y)

不思議なことに、位置xとyのデカルト積が出力されます.
ans =

     2     2     2     2
     2     2     2     2
     1     2     2     1
     2     2     2     2

あれこれ考えてみると
[x y] =

     2     1
     2     2
     3     2
     2     3

では、それを座標にしてもいいでしょう.そこで、でたらめを書きました.
A([x,y])
ans =

     2     1
     2     2
     1     2
     2     1

最初はなぜか分かりませんでしたが、Matlabは中のx、y行列をインデックスと認識していました.最初の列はインデックス値がxのときのAの値で、同じように2番目の列です.
これでsub 2 indを思い出し,位置をインデックスに変換する.
A=[1 1 1 ; 2 2 2 ;  1 2 1];
[x y] = find(A==2);
result=A(sub2ind(size(A),x,y));

result =

     2
     2
     2
     2

成功しました.
次のページを転載します.http://www.matlabsky.com/thread-357-1-1.html
Matlabの配列要素参照には、次の3つの方法があります.
1.下書き法(subscripts)
2.インデックス法(index)
3.ブール法(Boolean)
この3つの方法を使う前に、Matlabの配列要素は列ごとに格納されている(Fortranと同じ)ことを頭の中ではっきり覚えておいてください.例えば、次の2次元配列です.
A=
8 1 6
3 5 7
4 9 2
Matlabの格納順序は8,3,4,1,5,9,6,7,2,つまり先行後列,3次元配列に対しては先行後列,再ページである
対応する要素のインデックスと下付き文字はそれぞれ
Element Index Subscripts
8 1 (1,1)
3 2 (2,1)
4 3 (3,1)
1 4 (1,2)
5 5 (2,2)
9 6 (3,2)
6 7 (1,3)
7 8 (2,3)
2 9 (3,3)
上の例では、下付き文字とインデックスの違いが明確に説明されています.すなわち、Matlabは、要素が1つもない一意の識別ID(すなわちindex)を割り当てています.
1.下付き表記参照
A(ii,jj):iiおよびjjは、1次元ベクトル、スカラー、":"番号、または"end"であってもよい
C言語で接触したことがあるので、下付き文字の推定に詳しいですが、Matlabの下付き文字は複数行の複数列を同時に引用することができますが、C言語などは一度に1つしか引用できません.例えば、
A(2:3,3:3-1:1)は参照配列の2~3行、3~1列に対応する要素を表す
A(:,end)は最後の列要素を参照し、":"はすべての列または行を表し、"end"は最後の列または列を表し、"end-n"は最後からn番目の行または列を表す
A(1,end-1)は、1行目の最後から2番目の要素を参照することを示す
A([21 3],[11 2 2 1])は、参照が2つのベクトルで指定された要素、すなわちAの2,1,3,3行目と1,1,2,2,1,1列目に対応する要素を参照することを表す
>>A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>>A(2:3,3:-1:1)
ans =
7 5 3
2 9 4
>>A(:,end)
ans =
6
7
2
>>A(1,end-1)
ans =
1
>>A([2 1 3 3],[1 1 2 2 1])
ans =
3 3 5 5 3
8 8 1 1 8
4 4 9 9 4
4 4 9 9 4
2.インデックス法参照(つまりインデックスは格納順序)
A(index):indexは任意の配列であってもよく、indexの要素は正の整数でnumel(A)より大きくなく、indexと同じサイズの配列を返します.
下付き文字とインデックスの間はind 2 subとsub 2 ind関数で互いに変換できます.具体的にはヘルプを見ることができます.簡単です.
[I,J] = ind2sub(siz,IND)
IND = sub2ind(siz,I,J)
配列Aを列ベクトルに変換するには、A(:)を使用します.
A(8):Aを参照する8番目の要素を表す
B=A([1105 2 2 1 3]):Aの1,10,5,2,2,1,3番目の要素を順次参照し、indexサイズと同じ配列を返すことを表す.すなわちsize(B)=size(index)
A([25 9;1 1 1;8 6]):戻るときは3*3の行列
>>A=magic(5)%カッコでインデックス値
A =
17 (1) 24 (6) 1 (11) 8 (16) 15 (21)
23 (2) 5 (7) 7 (12) 14 (17) 16 (22)
4 (3) 6 (8) 13 (13) 20 (18) 22 (23)
10 (4) 12 (9) 19 (14) 21 (19) 3 (24)
11 (5) 18 (10) 25 (15) 2 (20) 9 (25)
>>A(8)
ans =
6
>>A([1 10 5 2 2 1 3])
ans =
17 18 11 23 23 17 4
>>A([2 5 9;1 1 1;8 5 6])
ans =
23 11 12
17 17 17
6 11 24
3.ブール法参照
A(X):Xは0と1からなるブール型のデータであり、size(A)=size(X)であり、対応する位置が1であればそのデータを残し、0であれば削除し、最後にAの格納順序で1つの列ベクトルを返す
Aが3*3の配列だとしたら
A(logical([10;0;0;0;1 0;0;0 1]):配列Aを参照した対角線要素を表し、logicalを使用して0/1配列をブール型に変換する必要があることに注意する
>>A=magic(3)%3*3の配列を生成
A=
8 1 6
3 5 7
4 9 2
>>x=logical([11 0;0 1;1;1 0 1])%doubleをboolean型データに変換
x =
1 1 0
0 1 1
1 0 1
>>A(x)%対応する位置が1のデータを参照し、カラムベクトルを返します.
ans =
8
4
1
5
7
2
>>x=A>5%は比較文があり、ブール型データを返し、対応する位置データが5より大きいものは1、そうでない場合は0
x =
1 0 1
0 0 1
0 1 0
>>A(x)%は、Aより5より大きい要素を返します.このコマンドは、A(A>5)またはfind(A>5)を一度に実行し、前者は特定の要素を返し、後者は5より大きいデータのインデックス値を返します.
ans =
8
9
6
7
>>A(A>5)%上記のコマンドを一度に実行
ans =
8
9
6
7
>>indx=find(A>5)%Aの5に対する要素を検索し、インデックス(index)値を返します.この場合、A(index)で特定の要素を返すことができます.
index =
1
6
7
8