문제

1 차원 배열이 있다고 가정 해 봅시다.

a = [1, 2, 3];

배열과 정수를 취하는 내장 MATLAB 기능이 있습니까? n 배열 n 번의 각 요소를 복제합니까?

예를 들어 전화합니다 replicate(a, 3) 돌아와야합니다 [1,1,1,2,2,2,3,3,3].

이것은 전혀 동일하지 않습니다. repmat. 나는 확실히 구현할 수있다 replicate 그렇게함으로써 repmat 각 요소에서 결과를 연결하지만 더 효율적인 기능이 내장되어 있는지 궁금합니다.

도움이 되었습니까?

해결책

R2015a 기준, 이있다 이를 위해 내장 및 문서화 된 기능, repelem:

repelem 배열의 요소를 복제합니다.
    W = repelem(V,N), 벡터와 함께 V 그리고 스칼라 N, 벡터를 만듭니다 W 각 요소 V 반복됩니다 N 타임스.

두 번째 인수는 또한 같은 길이의 벡터 일 수 있습니다. V 각 요소에 대한 복제 수를 지정합니다. 2D 복제 :

B = repelem(A,N1,N2)

필요하지 않습니다 kron 또는 더 이상 다른 트릭!

업데이트: 다른 빠른 방법과의 성능을 비교하려면 Q & A를 참조하십시오. 배열 요소의 사본 반복 : MATLAB의 런 길이 디코딩.

다른 팁

나는 팬입니다 크론 기능:

>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))

b =

    1     1     1     2     2     2     3     3     3

당신은 또한 볼 수 있습니다 이 관련 질문 매트릭스 인덱싱과 관련된 다른 솔루션 중 일부를보기 위해 (2 차원 행렬의 복제 요소를 다루었습니다). 다음은 그러한 솔루션 중 하나입니다 (영감을 얻었습니다 에드릭의 대답):

>> b = a(ceil((1:N*numel(a))/N))

b =

    1     1     1     2     2     2     3     3     3
a = [1 2 3];
N = 3;

b = reshape(repmat(a,N,1), 1, [])
>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)

ans =

     1     1     1     2     2     2     3     3     3

일부 이국적인 대안. 유용한 것보다 더 재미있다 :

  1. (첫 번째) 결과를 할당하십시오 meshgrid 벡터에 :

    b = NaN(1,numel(a)*n); %// pre-shape result
    b(:) = meshgrid(a,1:n);
    
  2. 곱한 매트릭스를 만듭니다 a 결과를 제공합니다.

    b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
    
  3. 사용 ind2sub 지수를 생성하려면 :

    [~, ind] = ind2sub([n 1],1:numel(a)*n);
    b = a(ind);
    

이미지 처리 도구 상자가있는 경우 또 다른 대안이 있습니다.

N = 3;
imresize(a, [1 N*numel(a)],'nearest')
% To get b = [1 1 1 2 2 2 3 3 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a,1,numel(temp_a));

% To get b = [1 2 3 1 2 3 1 2 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a',1,numel(temp_a));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top