문제

MATLAB과 함께 매트릭스의 모든 열에 함수를 적용하고 싶습니다. 예를 들어, 매트릭스를 벡터로 부드럽게 처리하는 대신 매트릭스의 모든 열에서 Smooth를 부드럽게 호출하고 싶습니다 (전화시 기본 동작입니다. smooth(matrix)).

나는 이것을 할 수있는 더 관용적 인 방법이 있어야한다고 확신하지만, 나는 그것을 찾을 수 없기 때문에 나는 map_column 기능:

function result = map_column(m, func)
    result = m;
    for col = 1:size(m,2)
        result(:,col) = func(m(:,col));
    end
end

다음과 같이 전화 할 수 있습니다.

smoothed = map_column(input, @(c) (smooth(c, 9)));

이 코드에 문제가 있습니까? 어떻게 개선 할 수 있습니까?

도움이 되었습니까?

해결책

솔루션은 괜찮습니다.

Horizcat은 큰 행렬에 대한 실질적인 성능 페널티를 정확하게합니다. 코드를 O (n) 대신 O (n^2)로 만듭니다. 100x10,000 행렬의 경우, 구현은 내 컴퓨터에서 2.6 초가 걸리고 Horizcat 1은 64.5 초를 차지합니다. 100x5000 행렬의 경우 Horizcat 구현은 15.7 초가 소요됩니다.

원한다면 기능을 약간 일반화하고 최종 차원이나 심지어 임의의 차원 (열만이 아니라)을 반복 할 수있게 할 수 있습니다.

다른 팁

MATLAB "for"명령문은 실제로 제공되는 모든 것의 열을 루프합니다. 일반적으로, 벡터가 (위의 예에서와 같이)로 전달 된 벡터가 행 벡터이기 때문에 스칼라 시퀀스를 초래합니다. 이것은 위의 코드를 다음과 같이 다시 작성할 수 있음을 의미합니다.

function result = map_column(m, func)
    result = [];
    for m_col = m
      result = horzcat(result, func(m_col));
    end

func가 열 벡터를 반환하지 않으면 다음과 같은 것을 추가 할 수 있습니다.

f = func(m_col);
result = horzcat(result, f(:));

그것을 열로 강제합니다.

어쩌면 항상 행렬을 연산자로 변환 한 다음 결과를 다시 변환 할 수 있습니다.

smoothed = smooth(input', 9)';

적어도 FFT 기능과 함께 작동합니다.

행렬의 열을 가로 질러 암시 적 루프를 유발하는 방법은 셀 펀을 사용하는 것입니다. 즉, 먼저 행렬을 셀 어레이로 변환해야하며 각 셀은 하나의 열을 유지합니다. 그런 다음 Cellfun에 전화하십시오. 예를 들어:

A = randn(10,5);

여기서 각 열의 표준 편차를 계산했음을 확인하십시오.

cellfun(@std,mat2cell(A,size(A,1),ones(1,size(A,2))))

ans =
      0.78681       1.1473      0.89789      0.66635       1.3482

물론, Matlab의 많은 기능은 이미 사용자가 알 수 있듯이 배열의 행이나 열에서 작동하도록 설정되어 있습니다. 이것은 물론 STD에 해당되지만이를 테스트하는 편리한 방법입니다. cellfun 성공적으로 일했습니다.

std(A,[],1)

ans =
      0.78681       1.1473      0.89789      0.66635       1.3482

큰 행렬을 다루는 경우 결과 매트릭스를 prealloged하는 것을 잊지 마십시오. 그렇지 않으면 CPU는 새 행/열을 추가 할 때마다 매트릭스를 반복적으로 다시 올리하는 많은주기를 소비합니다.

이것이 당신의 함수의 공통 사용 사례 인 경우, 입력이 벡터가 아닌 경우 기능을 열을 통해 자동으로 반복하게하는 것이 좋습니다.

이것은 문제를 정확하게 해결하지는 않지만 기능의 사용을 단순화합니다. 이 경우 출력도 행렬이어야합니다.

사용하여 행렬을 하나의 긴 열로 변환 할 수도 있습니다. m(:,:) = m(:). 그러나 이것이 의미가 있다면 기능에 따라 다릅니다.

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