2012-06-05 2 views
3

내가 arrayfun 사용하여 클래스 ID의 객체의 배열을 구축하는 데 필요한 객체 루프 :matlab에의 arrayfun는

s = []; 
for k = 1 : length(ids) 
    s = cat(1, s, ID(ids(k))); 
end 

그러나이 arrayfun의 사용에는 어떤 문제가 있습니까?

편집 (질문의 설명) : 문제 해결 방법은 여러 가지가 있지만 문제는 간단한 구문 s = arrayfun(@(id) ID(id), ids);이 작동하지 않는 것입니다. 감사.

답변

3

arrayfun에는 수행하지 않는 작업을 수행 할 것을 요청하고 있습니다.

The output from arrayfun must be

:

scalar values (numeric, logical, character, or structure) or cell arrays.

개체의 "대안"은 모든 출력으로 셀 어레이를 포함하여 이유 인 스칼라 유형의로 간주하지 않는다. 시도해 볼 한 가지는 cell2mat을 사용하여 출력을 원하는 형식으로 변환하는 것입니다. 한 줄로 끝낼 수 있습니다. (그래도 난 그것을 테스트하지 않았습니다.)

s = cell2mat(arrayfun(@(id) ID(id), ids,'UniformOutput',false)); 
+3

실제로 CELL2MAT은 다음과 같이 실패 할 것이다. 오류 '셀 배열이나 객체를 포함하는 셀 배열을 지원할 수 없습니다.' – Amro

+0

@Amro 흥미 롭습니다. 나가 그것을 시험하지 않았다고 말했다처럼, 그것을 지적하기를위한 감사합니다. 객체를 벡터로 처리하는 방법이 있습니까? – tmpearce

+0

당신은 ARRAYFUN이 아닌 객체 배열을 만들 수 있습니다 (나는 대답을 게시했습니다). 사실 ARRAYFUN은 객체의 배열을 (입력으로) 반복 할 수 있습니다. 출력으로 반환하지 않습니다 (지적한대로 셀의 스칼라를 반환해야합니다). @robince가 보여준대로 할 수도 있습니다. – Amro

5

아마도 가장 쉬운 방법은 cellfun을 사용하거나 'UniformOutput' 옵션을 설정하여 arrayfun이 셀 배열을 반환하도록하는 것입니다. 그런 다음이 셀 배열을 obect의 배열로 변환 할 수 있습니다 (위의 cat을 사용할 때와 동일).

s = arrayfun(@(x) ID(x), ids, 'UniformOutput', false); 
s = [s{:}]; 
+1

감사합니다. 그러나 루프 메소드와 같은 패치로 보입니다. 내 질문은'arrayfun (@ (id) ID (id), id)'가 작동하지 않는 이유였다. 그것은 Matlab의 버그입니까, 아니면 잘못된 사용입니까? – Serg

+0

나는 때로는 명령을 확장하기 위해 파이썬 기능을 놓치고 자주 배열 구성에 셀을 사용한다. 나는 한 번의 명령으로 익명의 함수를 선언한다 :'dealcell = @ (x) x {:};' – hugovdberg

+0

's = reshape (s, size (ids))'가 필요하다. 실제로'arrayfun'과 일치하게한다. – Eric

2

이 내가 만드는 것이 방법 인 array of objects :

항상 인수와 "기본 생성자"를 제공하는 것이 좋습니다
s = ID.empty(0,5); 
for i=5:-1:1 
    s(i) = ID(i); 
end 

, 또는 최소한 기본값을 사용하십시오 :

classdef ID < handle 
    properties 
     id 
    end 
    methods 
     function obj = ID(id) 
      if nargin<1, id = 0; end 
      obj.id = id; 
     end 
    end 
end 
관련 문제