가 우 난 그냥 질문을 사랑하는 일 같은 예술 "무엇을 ... 할 수있는 가장 빠른 방법이다"
는 여기에 몇 가지 대안을, 그리고 비교 :
% Initalize
map = 'CATG';
strCellArr = cellfun(@(x) map(randi(4,100,1)),cell(4000,1), 'UniformOutput', false);
% Your original method
tic
a = true;
for el = strCellArr
if length(el{1}) ~= 100
a = false;
break;
end
end
toc
% My solution
tic
a = all(cellfun('length', strCellArr) == 100);
toc
% Dang Khoa's method
tic
a = all(cellfun(@(x) length(x) == 100, strCellArr));
toc
% Engineero's method
tic
a = all(cellfun(@length, strCellArr) == 100);
toc
결과 :
Elapsed time is 0.001158 seconds. % loop
Elapsed time is 0.000455 seconds. % cellfun; string argument
Elapsed time is 0.031897 seconds. % cellfun; anonymous function
Elapsed time is 0.006994 seconds. % cellfun; function handle
리틀 알려진 사실 : 문자열 입력이 cellfun
은 cellfun
바이너리에 직접 작성된 함수를 의미하므로 익명의 함수를 평가하지 않아도됩니다.즉, cellfun
는 제작, 그 반복의 모든에 MATLAB 인터프리터를 통해 패스를 만들 필요가 없습니다이 성난 빠른 :) 이제
, 질문의 두 번째 부분 :
% Engineero
tic
A = 'ATCG';
all(all(ismember(char(strCellArr), A)));
toc
% My solution
tic
C = char(strCellArr);
~any(C(:)==' ');
toc
결과 : ismember
는 MATLAB m의 코드로 구현되고, (에러 검사, 오류 WA 사용자 편의를위한 코드 투성이 때문에
는
Elapsed time is 0.061168 seconds. % ismember
Elapsed time is 0.005098 seconds. % direct comparison to whitespace
차이가 생긴다 등), 정교한 일반화, 루프 구조 및 기타 모든 것들이 모두 성능 저하의 원인이됩니다. 우리가 만 공간 char
에 캐스팅에 배열에 추가됩니다 것을 사전에 알고 있기 때문에
, 우리는 하지 명시 적으로 'A'
의 발생, 'C'
, 'T'
, 'G'
를 확인해야합니까,하지만 그들의 외계인. 의미, 그냥 그 공백을 찾으십시오 :)
말할 필요도없이,이 시간은 모두 사실상 무시할 만합니다. 그리고 이것은 실제로 정말로 유용한 것보다 더 정신적 인 자위 행위입니다. 그러나 그 재미! :)
내 솔루션에서와 같이'cellfun' 안에'== 100'을 사용하면 외부에 두는 것과 비교하여 런타임이 455 % 증가했습니다. 나는 이것이 왜 있는지 궁금해. 이 경우 분명히 무시할 만하지만 문제를 확대하는 것은 비효율적입니다. 내 솔루션은 프로그래머의 * 장래성, 즉 "설계 의도"가 @ Engineero의 솔루션보다 더 낫다는 생각이 듭니다. 그러나 분명히 그는 스피드에서 승리합니다. 또한, 당신이 나에게 준 학습에 감사드립니다. 문자열 인수! 나는 여전히 디자인 의도가 분명하기 때문에 anon fcns를 사용하는 것을 선호합니다. 그러나 속도가 필요하다면 이것은 좋은 것입니다. –
@DangKhoa : 나는 동의한다. 실제로 MATLAB의 경우가 꽤 자주 있습니다. 설탕으로 코팅 된 것이 많을수록 성능 저하가 더 심해질 것입니다. * 차이점은 MATLAB 인터프리터에서'@ (x)'가 * 평가 *를 강제한다는 사실에 기인합니다. 직접'@ length '는'length' 함수의 * lookup * 만 허용합니다. –
+1 Nitpick :'@ length'는 익명의 함수가 아닙니다. 함수 핸들이고, 아마도 내장 함수 인'length' 함수입니다. 그래서 "짧은 익명의 기능"은 다소 잘못된 이름입니다. 즉, anons은 조금 느립니다 (적어도 과거에는). 그러나 더 긴 익명의 함수는 추가 함수 호출 ('=='과''length()'의 맨 위에있는 anon 호출 자체)과'100'과 임시 변수 생성을 통해 더 많은 (비싼) 작업을 수행하고 있습니다. –