2016-05-02 7 views
1

悪いタイトルについて申し訳ありませんが、私はこの質問によく耳を傾けています。基本的には、行ごとに2次元行列から要素を抽出し、特定の列(k)から始まるいくつかの要素(N)を取り出します。 forループでは、このようになります。開始要素とサイズからマトリックスの要素を抽出する

A = magic(6); 
k = [2,2,3,3,4,4]; % for example 
N = 3; 
for j = 1:length(A) 
    B(j,:) = A(j,k(j):k(j)+N-1); 
end 

私はそれよりもそれを行うための優しい方法があると思います。

答えて

3

bsxfunを使用して、使用するインデックスの配列を作成できます。次にこれを行番号と組み合わせてsub2indに渡します。 sub2ind(若干より不可解)無し

inds = sub2ind(size(A), repmat(1:size(A, 1), 3, 1), bsxfun(@plus, k, (0:(N-1))')).'; 
B = A(inds); 

または交互。

B = A(bsxfun(@plus, 1:size(A,1), ((bsxfun(@plus, k, (0:(N-1)).')-1) * size(A,1))).'); 
0

ここbsxfun'sマスキング機能を使用して一つの手法ですので、logical indexing -

C = (1:size(A,2))'; 
At = A.'; 
B = reshape(At(bsxfun(@ge,C,k) & bsxfun(@lt,C,k+N)),N,[]).'; 
関連する問題