2015-01-08 2 views
0

나는 van Loan의 저서 에서 Matlab 함수를 가지고 있습니다. 과학 계산 소개. 행렬 C를 생성합니다. 여기서 각 행은 모든 요소가 하나씩 오른쪽으로 시프트 된 이전 행입니다. 나는 교대가 오른쪽으로 바뀌기를 바란다. 그러나 나는 논리에 약간의 문제가있다.순환 행렬을 코딩하는 Matlab

특히 오른쪽 시프트의 경우 아래 루프가 의미가 있습니까? 위해

for i=2:n 
C(i,:)=[C(i-1, n-2) C(i-1, 1:n-1)]; 
end 


function C= circulantShift(a) %shifts to left 
a=[1 2 3 4]; 
n=length(a); 
C=zeros(n,n); 
C(1,:)=a; 
for i=2:n 
    C(i, :)=[C(i-1, n) C(i-1, 1:n-1)]; 
end 
+0

"교대가 왼쪽으로 바뀌 었습니까?" 'for' 루프 다음에'wrev (C)'를 시도하십시오. – David

+0

@David가 작동하지 않는다면 wrev도 matlab 함수입니까? – codeAligned

+0

죄송합니다.'wrev'는 벡터를위한 것이고 대신'fliplr'을 시도하십시오. – David

답변

1

는 사용할 필요가 왼쪽으로 이동합니다 :

C(i,:)=[C(i-1, 2:n) C(i-1, 1)]; 


C = 

    1 2 3 4 
    2 3 4 1 
    3 4 1 2 
    4 1 2 3 
+0

애완 동물 형사와 같은 대답이지만 감사합니다. – codeAligned

1

첫째, 기능을 circulantShift(a) 변화를 오른쪽이 아닌 왼쪽으로.

로직은 다음과 같습니다. matlab 에서 수평 연결을 수행합니다. 따라서 [C(i-1, n) C(i-1, 1:n-1)]은 위의 행에있는 n 번째 (마지막) 숫자와 그 위에있는 첫 번째 1 : n-1 숫자로 구성된 행을 만듭니다. 이것은 분명히 오른쪽으로 순환 이동합니다.

왼쪽으로 이동하려면 뒤로 이동하십시오. 위의 행에서 두 번째 숫자부터 n 번째 숫자까지 가져온 다음 위의 행에서 첫 번째 숫자를 찾습니다. 이와 같이 :

[C(i-1, 2:n) C(i-1, 1)] 
관련 문제