8

MATLAB でのこの非常に単純な問題に対するエレガントな解決策を探しています。行列があるとします

>> M = magic(5)

M =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9 

および次の形式の論理変数

I =

     0     0     0     0     0
     0     1     1     0     0
     0     1     1     0     0
     0     0     0     0     0
     0     0     0     0     0

の値にM関連付けられている の要素を取得しようとすると、列ベクトルが得られます1I

>> M(I)

ans =

     5
     6
     7
    13

[5 7 ; 6 13]この論理インデックスから行列を取得する最も簡単な方法は何ですか?

の非ゼロ要素の形状がわかっている場合はI、インデックス作成後に形状変更を使用できますが、これは一般的なケースではありません。

また、MATLAB でのこのタイプのインデックス付けの既定の動作は、ゼロ以外の値がI行列を形成しない場合に関して一貫性を強制することを認識していますが、この特定のケースに対する簡単な解決策があるかどうか疑問に思います.

4

3 に答える 3

11

これは、これを行う 1 つの方法です。のすべての行にIは同じ数の 1 があると想定されます。また、 は長方形でなければならないIため、同じ数を持つのすべての列には 1 があると想定されます。Submatrix

%# Define the example data.

M = magic(5);
I = zeros(5);
I(2:3, 2:3) = 1;

%# Create the Submatrix.

Submatrix = reshape(M(find(I)), max(sum(I)), max(sum(I')));
于 2012-07-10T18:14:47.623 に答える
3

これは非常に簡単な解決策です:

T = I(any(I'),any(I));
T(:) = M(I);
于 2013-03-26T15:08:01.780 に答える
2
M = magic(5);
I = [ ... ];

ind = find(I); %# find indices of ones in I
[y1, x1] = ind2sub(size(M), ind(1));   %# get top-left position
[y2, x2] = ind2sub(size(M), ind(end)); %# get bottom-right position
O = M(y1:y2, x1:x2); %# copy submatrix
于 2012-07-10T18:14:38.263 に答える