0

10X3 のマトリックスがあり、各列のサブセットのみを使用して新しいマトリックスを作成したいのですが、インデックス配列とそのポイントから定義された範囲に基づいて、列ごとにサブセットを異なるものにしたいと考えています。

たとえば、行列が次の場合 (私がこれを行っているとき、数値は実際にはそのような直線的に上昇しません):

A = ...
   [1   11  21
    2   12  22
    3   13  23
    4   14  24
    5   15  25
    6   16  26
    7   17  27
    8   18  28
    9   19  29
    10  20  30]

インデックス配列はpos = [5,16,24]+/-3 の広がりを持っています (したがって、各インデックス付きセルの両側に 3 つのセル)、新しいマトリックスを次のようにします。

2   13  21
3   14  22
4   15  23
5   16  24
6   17  25
7   18  26
8   19  27

したがって、新しいマトリックスでは、インデックス配列によって参照されるすべての値が整列する必要があります。

私は実際にはもっと大きなマトリックス (最大 400X100) でこれを行っているので、ループが良いアイデアかどうかはわかりません.

アイデアをありがとう!

4

3 に答える 3

3
shift          = 3;

% Prevent out of bounds
bread          = NaN(shift,size(A,2));
A              = [bread;A;bread] 
pos            = pos+shift;

% Create mask
B              = zeros(size(A));
B(pos-shift)   = 1;
B(pos+shift+1) = -1;
B              = logical(cumsum(B));

% Select and reshape
reshape(A(B),shift*2+1,numel(pos))
于 2013-06-27T20:46:22.273 に答える
1

あなたは使用することができます

r = 3;
B = A(bsxfun(@plus, pos, (-r:r)'));
于 2013-06-27T22:38:41.360 に答える
0

これが方法arrayfunです:

r = 3; % Spread range
B = arrayfun(@(x) A(x-r:x+r)', pos, 'UniformOutput', false);

Bはセルになりますが、次を使用してマトリックスを取得できます[B{:}]

于 2013-06-27T20:53:05.340 に答える