문제

내가 어떤 도움을 필요로 변환하 2X2matrix 을 4X4 매트릭스에는 다음과 같은 방법으로:

A = [2 6;
     8 4]

이 되어야 한다:

B = [2 2 6 6;
     2 2 6 6;
     8 8 4 4;
     8 8 4 4]

어떻게 해야 하나요?

도움이 되었습니까?

해결책

A = [2 6; 8 4];
% arbitrary 2x2 input matrix

B = repmat(A,2,2);
% replicates rows & columns but not in the way you want

B = B([1 3 2 4], :);
% swaps rows 2 and 3

B = B(:, [1 3 2 4]);
% swaps columns 2 and 3, and you're done!

다른 팁

에서 최신 버전의 MATLAB(R2015a 이상)을 할 수있는 가장 쉬운 방법이 사용하는 repelem 기능:

B = repelem(A, 2, 2);

이전 버전에 대한 짧은 대안을 다른(주)인덱싱 기반의 솔루션을 사용하는 기능 kronones:

>> A = [2 6; 8 4];
>> B = kron(A, ones(2))

B =

     2     2     6     6
     2     2     6     6
     8     8     4     4
     8     8     4     4

Jason의 솔루션보다 훨씬 쉽게 수행 할 수 있습니다.

B = A([1 1 2 2], :);  % replicate the rows
B = B(:, [1 1 2 2]);  % replicate the columns

다음은 다음과 같습니다.

A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );

인덱싱을 사용하여 모든 작업을 수행하고 A의 크기 나 모양에 의존하지 않습니다.

이것은 작동합니다 :

A = [2 6; 8 4];
[X,Y] = meshgrid(1:2);
[XI,YI] = meshgrid(0.5:0.5:2);
B = interp2(X,Y,A,XI,YI,'nearest');

이것은 단지 x, y ∈ {1,2}에서 x, y ∈ {0.5, 1, 1.5, 2}에서 a (x, y)의 2 차원 가장 가까운 이웃 보간입니다.

편집하다: Jason S와 Martijn의 솔루션에서 스프링 보딩에서 이것은 아마도 가장 짧고 명확한 솔루션이라고 생각합니다.

A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);

다음은 임의의 행렬에 맞는 간단한 인덱싱을 기반으로하는 방법입니다. 우리는 각 요소가 MXN 서브 매트릭스로 확장되기를 원합니다.

A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))

예시:

>> A=reshape(1:6,[2,3])

A =

     1     3     5
     2     4     6

>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))

ans =

     1     1     1     1     3     3     3     3     5     5     5     5
     1     1     1     1     3     3     3     3     5     5     5     5
     1     1     1     1     3     3     3     3     5     5     5     5
     2     2     2     2     4     4     4     4     6     6     6     6
     2     2     2     2     4     4     4     4     6     6     6     6
     2     2     2     2     4     4     4     4     6     6     6     6

방법이 어떻게 작동하는지 보려면 인덱싱을 자세히 살펴 보겠습니다. 우리는 연속 숫자의 간단한 행 벡터로 시작합니다.

>> m=3; 1:m

ans =

     1     2     3

다음으로, 우리는 1 차원에서 m 회 반복하여 행렬로 확장합니다.

>> M=4; I=repmat(1:m,[M 1])

I =

     1     2     3
     1     2     3
     1     2     3
     1     2     3

매트릭스를 사용하여 배열을 색인하면 표준 MATLAB 순서에서 매트릭스 요소가 연속적으로 사용됩니다.

>> I(:)

ans =

     1
     1
     1
     1
     2
     2
     2
     2
     3
     3
     3
     3

마지막으로 배열을 색인화 할 때 'END'키워드는 해당 차원의 배열 크기로 평가됩니다. 결과적으로 예에서 다음은 다음과 같습니다.

>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
>> A(repmat(1:2,[3 1]),repmat(1:3,[4 1]))
>> A(repmat([1 2],[3 1]),repmat([1 2 3],[4 1]))
>> A([1 2;1 2;1 2],[1 2 3;1 2 3;1 2 3;1 2 3])
>> A([1 1 1 2 2 2],[1 1 1 1 2 2 2 2 3 3 3 3])

이를 수행 할 수있는 reshape () 함수가 있습니다 ...

예를 들어:

reshape(array, [64, 16])

훌륭한 비디오 자습서를 찾을 수 있습니다 여기

건배

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top