2012-08-03 4 views
-1
capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false)) 

그 코드를 사용하면 코드가 실행되지 않고 다음 명령과 같은 명령이 표시됩니다.이 명령의 의미는 무엇입니까

??? Array dimensions must match for binary array op. 
+0

http://www.mathworks.de/help/techdoc/ref/arrayfun.html – CloudyMarble

+0

http://www.mathworks.de/help/techdoc/ref/cell2mat.html – CloudyMarble

+0

'resulti'가 행 벡터 인 경우,'bsxfun (@ eq, resulti, nonzeros (unique (resulti)))와 동일합니다.''그래서'resulti'의 크기를 확인하고 그것이 무엇이라고 생각하는지 비교하십시오 (해당 코드를 참조하여) –

답변

1

이 모든 것이 Matlab의 설명서를 통해 확인할 수 있습니다.이 설명서는 항상 첫 단계입니다.

cell2mat : 배열의 모든 요소에 대한 몇 가지 기능을 평가 : 당신은

arrayfun을 정의하는 몇 가지 형식에 따라 매트릭스에 셀 어레이로 변환

여기에 명령의 고장이다,라고 말했다 가졌어요. 함수는 익명의 함수 (예 : @(b) sum(resulti == b,1))

sum : 특정 방향으로 행렬의 모든 요소를 ​​합산 할 수 있습니다. 방향 1 : 행을 아래로, 방향 2 : 열을 따라 등

nonzeros : 입력 배열에서 모두 0을 제거하여 새 배열을 만듭니다. 이렇게하면 입력 모양과 관계없이 열 벡터가 출력됩니다.

unique : 모든 값이 중복 된 입력 배열을 반환합니다. 출력도 정렬됩니다. 모든 명령에 대한 자세한 내용은

유형 help [command] 또는 doc [command] 당신의 명령에서 이러한 결합 이제

, (나는 당신이 추천!) :

A = nonzeros(unique(resulti)) 

열의 모든 고유 한 항목을 반환합니다 벡터, 모든 제로 제거.

B = arrayfun(@(b)sum(resulti==b), A, 'UniformOutput', false) 

새로 생성 된 열 벡터 A의 모든 항목에 @(b) sum(resulti == b,1) 기능을 실행하고 ('UniformOutput'false가 설정되어 있기 때문에, 셀)의 셀 어레이에 B들을 수집. 이 함수는 단순히 resulti의 각 요소를 실행 인덱스 b과 비교하고 행을 따라 총 개수를 찾습니다. 그리고, 마지막으로,

capi = cell2mat(B) 

는 정상 매트랩 배열에 다시 세포 배열 B 변환합니다.

이 명령의 목적은 resulti의 각 열의 고유하지 않은 발생 수를 계산하는 것으로 보입니다. @GuntherStruyf에서 암시 한 바와 같이,이 모든 명령은 잘 관리되고 읽기 쉬운 코드가 아닌 해킹 된 함께 강제 된 한 줄짜리 코드처럼 보입니다. 나는 개인적으로 arrayfun (느림)을 피하고 bsxfun 또는 for -loop (더 빠르다 (예, for -loop)을 더 잘 읽을 수 있음)을 사용하여 여러 줄로 나누기로했다.

하지만 그건 여론 :)에 반하는 의견의 문제 (의

관련 문제