2011-10-30 2 views
4

Matlab을 처음 사용하고 배열에 대해 동일한 연산을 수행 할 때 루프 대신 점 연산자를 사용하는 것이 더 빠르다고 들었습니다.배열 (Matlab)의 모든 클래스 인스턴스에 대한 호출 메서드

예 :

A = 1:200 
A = A .* 10; 

대신는 :

A = 1:200 
for i = 1:200 
    A(i) = A(i) * 10; 
end 

I 물체의 다차원 배열 (I 객체가 생성 클래스의 인스턴스) 만들었다. for 루프를 사용하지 않고 모든 인스턴스에서 동일한 인수를 사용하여 동일한 메소드를 호출 할 수 있습니까?

나는이 3 개 접근법을 시도,하지만 그들은 작동하지 않습니다 (A는 세 가지 차원 배열) :

A(:,:,:).methodName(argument1, argument2); 
A.methodName(argument1, argument2); 
A..methodName(argument1, argument2); 
+1

아니요, 수동으로 루프해야합니다. 한 줄 구문을 허용하는 arrayfun/cellfun 함수가 있지만 (분명히) 후드 아래의 루프이기도하고 수동 루프보다 느려질 수도 있습니다. 행렬 곱셈과 메쏘드 호출은 두 가지 다른 것들입니다. – Mikhail

+0

객체 배열에서도 이러한 함수 (arrayfun/cellfun)를 사용할 수 있습니까? (배열이 작기 때문에 속도가 문제가되지 않고 코드 가독성이 간소화됩니다) –

+1

이 작업을해야합니다 :'arrayfun (@ (x) x.methodName (argument1, argument2), A)' – Mikhail

답변

4

당신은 '함수 형태'

를 사용하여 메소드를 호출 할 수 있어야한다
methodName(A, argument1, argument2) 

그러나 'methodName'은 객체 배열을 전달한 사실을 처리해야합니다. 다음은 간단한 예를

classdef Eg 
    properties 
     X 
    end 
    methods 
     function obj = Eg(arg) 
      if nargin == 0 
       % Default-constructor required 
       arg = []; 
      end 
      obj.X = arg; 
     end 
     function x = maxX(objs) 
     % collect all 'X' values: 
      xVals = [objs.X]; 
      % return the max 
      x = max(xVals(:)); 
     end 
    end 
    methods (Static) 
     function testCase() 
     % Just a simple test case to show how this is intended to work. 
      for ii = 10:-1:1 
       myObjArray(ii) = Eg(ii); 
      end 
      disp(maxX(myObjArray)); 
     end 
    end 
end 

가능하다면, 그것은 오히려 작은 물체를 많이보다 큰 배열을 저장하는 적은 수의 객체를 가지고 (MATLAB)에 좋습니다.

+1

+ 1 역순으로 객체 배열을 생성하는 방법 (공간을 한 번 할당하고 동적으로 커지는 것을 피하는 방법) – Amro

+0

예를 들어 논리 색인을 사용할 수도 있습니다. 'x = max ([objs.X]> 0)'. – JaBe

관련 문제