2012-01-16 5 views
2

의 셀 어레이의 효율적 문자열 길이를 계산하기 :어떻게 matlab에의 세포 배열이 문자열

strings = {'one', 'two', 'three'}; 

가 어떻게 효율적으로 세 문자열의 길이를 계산할 수 있습니까? 지금은 for 루프를 사용하면 문자열의 많은 양의 (나는 그들 중 480,863있어)가 때 그러나 사용할 수 없게 느린

lengths = zeros(3,1); 
for i = 1:3 
    lengths(i) = length(strings{i}); 
end 

. 어떤 제안?

답변

9

은 또한 사용할 수 있습니다.
속도가 느린 경우 우선 프로파일 러를 실행하여 병목 현상이 어디에 있는지 확인해야합니다. 그래야만 최적화해야합니다.

편집 : 그냥 '길이' 나이가 매트랩 버전 cellfun의 내장 함수로 사용했다고 회상했다. 그래서 실제로 빨라질 수도 있습니다!

cellfun('length',strings) 

편집 (2)을보십시오 : 내 첫 번째 대답은 추측 것을 인정해야한다. @Rodin의 의견에 따라, 나는 속도 향상을 확인하기로 결정했다.

첫째, 문자열을 많이 생성하고 디스크에 저장하는 코드 : 그리고

function GenerateCellStrings() 
    strs = cell(1,10000); 
    for i=1:10000 
     strs{i} = GenerateRandomString(); 
    end 
    save strs; 
end 

function st = GenerateRandomString() 
    MAX_STR_LENGTH = 1000; 
    n = randi(MAX_STR_LENGTH); 
    st = char(randi([97 122], 1,n)); 

end 

, 벤치 마크 자체 :

function CheckRunTime() 
    load strs; 
    tic; 
    disp('Loop:'); 
    for i=1:numel(strs) 
     n = length(strs{i}); 
    end 
    toc; 

    disp('cellfun (String):'); 
    tic; 
    cellfun('length',strs); 
    toc; 

    disp('cellfun (function handle):'); 
    tic; 
    cellfun(@length,strs); 
    toc; 

end 
다음

는 벤치 마크의 코드

결과는 다음과 같습니다.

루프 :
경과 시간은 0.010663 초입니다.
cellfun (문자열) :
경과 시간은 0.000313 초입니다.
cellfun (함수 핸들) :
경과 시간은 0.006280 초입니다.

와우! '길이'구문은 루프보다 약 30 배 빠릅니다! 나는 그것이 왜 그렇게 빨리 될지 짐작할 수 있습니다. 어쩌면 그것이 length을 특별히 인식한다는 사실 일 수도 있습니다. JIT 최적화가 될 수 있습니다.

편집 (3) - 속도 향상을 위해 the reason을 발견했습니다. 실제로 length의 인식입니다. info에 @reve_etrange를 주셔서 감사합니다.

+0

그 방법은 for 루프를 제거하고 엄청난 양의 문자열을 매우 빠르게 처리합니다. 고맙습니다! –

+0

'cellfun ('length', strings)'(입력 인자가 충분하지 않다.)'cellfun ('@ length', strings)'에러가 발생한다. –

+0

'cellfun' 구문은 iterator 변수와'strs {i}'의 상수 조회를 제거하기 때문에 for 루프보다 훨씬 빠르며 시스템을 완전히 망칠 것입니다. 그렇기 때문에 Matlab 코드의 벡터화가 중요한 이유입니다! –

2

문자열의 길이를 유지하고 문자열을 업데이트 할 때 해당 배열을 업데이트하십시오. 이렇게하면 문자열 길이에 O (1) 시간 액세스 할 수 있습니다. 문자열을 생성하거나로드하는 동시에 업데이트하기 때문에 정수 배열 작업이 문자열 연산보다 (일반적으로) 빠르기 때문에 작업 속도가 느려져서는 안됩니다.

cellfun(@length, strings) 

이 빨리되지 않습니다,하지만 코드를 명확하게 :

+0

셀 배열은 매트 파일로 저장되므로로드 할 때 문자열 길이를 계산하는 것은 실제로 옵션이 아닙니다. –