2017-12-07 4 views
2

Nx(N-1)のMatlabにはAの行列があります。マトリクスの特定のインデックスを選択するためのMatlabコードのベクトル化

N=5; 
A=[1 2 3 4; 
    5 6 7 8; 
    9 10 11 12; 
    13 14 15 16; 
    17 18 19 20]; 

特定の方法でAの要素を並べ替える必要があります。具体的には私は次元の行列Bを作成する(N-1)xNように:i=1,...,Nため

B(:,i)

1)i-1Ai-1番目の列の要素と

2を収集)最後のN-ii列の要素はAです。

i=1の場合、Ai-1列は存在しないため、1)はスキップされます。同様に、i=Nの場合、Ai列が存在しないため、2)はスキップされます。

B=[5 1 2 3 4 
    9 10 6 7 8 
    13 14 15 11 12 
    17 18 19 20 16]; 

上記の例では


このコードは、私が欲しいものを行います。私は効率的な方法でそれをベクトル化するためにあなたの助けを求めています。

B=zeros(N-1,N); 
for i=1:N 
    if i>1 && i<N 
    step1=A(1:i-1,i-1); 
    step2=A(i+1:N,i); 
    B(:,i)=[step1;step2]; 
    elseif i==1 
    B(:,i)=A(i+1:N,i);  
    elseif i==N 
    B(:,i)=A(1:i-1,i-1); 
    end 
end 

答えて

3

Aの下三角行列と上三角行列を抽出します。そして、 "対角線シフト" でそれらを再構築:

u = triu(A); 
l = tril(A,-1); 
B = padarray(u(1:end-1,:),[0 1],'pre') + padarray(l(2:end,:),[0 1],'post'); 
0

もう一つの有効なアプローチをtriltriuと組み合わせlogical indexingを使用して:

B = zeros(size(A')); 
B(tril(true(size(B)))) = A(tril(true(size(A)), -1)); 
B(triu(true(size(B)), 1)) = A(triu(true(size(A)))); 

結果:

>> B 

B = 

    5  1  2  3  4 
    9 10  6  7  8 
    13 14 15 11 12 
    17 18 19 20 16 
関連する問題