2016-05-31 4 views
1

1000x1 (또는 그 이상)의 셀 배열 VsCell이 있습니다. VsCell의 각 항목은 501x567 매트릭스입니다. 나는 세포에 포함 된 모든 행렬에서 한 위치를 차지하는 원소를 추출하고자합니다. 기본적으로 다음과 같습니다.matlab 셀 어레이의 n 번째 요소 선택

셀의 배열의 모든 첫 번째 요소 VsCell {:} (2,1) - 배열의 모든 첫 번째 행 2 요소 세포에서.

그런 다음이 선택의 평균 또는 중간 값을 취하여 VsCell 배열의 평균/중앙값/등을 나타내는 단일 [501x567] 매트릭스 배열을 채 웁니다. 평균 (VsCell {:} (1,1)).

VsCell {:} (1,1)을 시도했지만 "잘못된 셀 참조 연산"을 반환합니다.

또한 루프/cellfun에 거의 없거나 전혀없이이 작업을 수행 할 수 있습니까? 온라인에서 찾은 예제를 사용하여 실제로이 작업을 수행 할 수 없었습니다.

시간 내 주셔서 대단히 감사합니다. 필요한 경우 추가로 명확하게 설명 드리겠습니다.

답변

3

당신이하려는 것은 루프가 없거나 cellfun 인 셀을 사용하여 수행 할 수 있다고 생각하지 않습니다. 셀은 이기종 데이터 구조이기 때문에 각 요소가 호환 가능한 모양을 가질 것이라는 보장은 없습니다. Heck, 셀의 요소 번호 3은 다른 셀이나 문자열 또는 사용자 정의 클래스 인스턴스 일 수도 있습니다! 나는 당신이하려고하는 방식으로 세포가 색인 될 수 없다는 것이 놀랍지 않다는 것을 말하고 있습니다.

그러나 사기꾼 cat enate 그와 더 높은 차원 배열로 세포 및 작업 :

VsMat = cat(3,VsCell{:}); % cell as comma separated list 
MatMeans = mean(VsMat,3); % mean along dimension 3, where they are concatenated 
MatMedians = median(VsMat,3); 
MatSums = sum(VsMat,3); 

, 어쨌든 빨리해야 배열을 사용한 작업 단일 트레이드 오프를 제외하고 그래서 cat (느림)을 호출하면 어쨌든 균질 배열을 사용하는 것이 더 나을 것입니다.

+1

감사합니다. @Andras! 당신 말이 맞습니다, 나는 속도로 배열을 사용하기로했습니다. 고양이는 일에 너무 나쁘지 않습니다. 내 데이터 집합이 실제로 커질 수 있으므로 중첩 된 for-loop를 사용하는 것보다 낫습니다. – QP1

+0

cat 메서드는 배열의 크기 제한까지 작동합니다. 그 후에 메모리 오류가 발생합니다. 당신은 아마 어떤 제안이 있습니까. 나는이 시점에서 cellfun 또는 for 루프 구현에도 신경 쓰지 않을 것이다. 덕분에 – QP1

+0

@ QP1이 흥미 롭습니다.'cat()'이후의 배열은 셀 자체보다 공간이 적습니다. 두 가지 가능한 설명은 (1) 데이터가 너무 커서 한 번에 하나의 복사본 만 메모리에 저장되므로 원래 셀 + 새 배열이 너무 많거나 (2)'cat'에 메모리 오버 헤드가 있습니다. 두 번째 경우에는 'VsMat = 0'([크기 (VsCell {1}, 길이 (VsCell));}로 미리 할당 한 다음'ks '에 대한 루프에서'VsMat (:, : 'cat'을 사용하는 대신에,'cat'을 사용하는 것이 좋습니다. 첫 번째 경우에는 쉬운 방법이 있는지 확신 할 수 없으므로 두 번째 우선 시도하십시오;) –