2017-12-07 10 views
2

의 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의 요소를 다시 정렬합니다. 특히 I는 차원의 행렬 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
tril

triu과 결합하여 다른 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 
관련 문제