2010-05-15 3 views
1

이전에, 나는 다음과 같이 mutator를 구현했다. 그러나 나는 반복적 인 OO 알고리즘에서 놀랍도록 느리게 움직였다. 나는 모든 함수 호출에서 객체를 복제했기 때문에 그럴 것 같았다.Matlab에서 효율적인 인스턴스 변수 변경자를 만드는 방법은 무엇입니까?

%% Example Only 
obj2 = tripleAllPoints(obj1) 
    obj.pts = obj.pts * 3; 
    obj2 = obj1 
end 

그때 ... 출력 객체를 사용하지 않고 뮤 테이터를 구현하려고하지만, MATLAB에서 나는이 작업을 수행 할 수있는 표시 - 변경 때문에 범위 문제로 "스틱"하지 않습니다?

%% Example Only 
tripleAllPoints(obj1) 
    obj1.pts = obj1.pts * 3; 
end 

응용 프로그램의 목적으로, 매우 단순화 된 코드 (OO 및 재귀를 사용함)는 다음과 같습니다.

classdef myslice 

properties 
    pts  % array of pts 
    nROW % number of rows 
    nDIM % number of dimensions 
    subs % sub-slices 
end % end properties 

methods 
    function calcSubs(obj) 
     obj.subs = cell(1,obj.nROW); 
     for i=1:obj.nROW 
      obj.subs{i} = myslice; 
      obj.subs{i}.pts = obj.pts(1:i,2:end); 
     end 
    end 

    function vol = calcVol(obj) 
     if obj.nROW == 1 
     obj.volume = prod(obj.pts); 
     else 
     obj.volume = 0; 
     calcSubs(obj); 
     for i=1:obj.nROW 
       obj.volume = obj.volume + calcVol(obj.subs{i}); 
     end 
     end 
    end 

end % end methods 

end % end classdef 

답변

3

Matlab에는 두 가지 유형의 클래스 인 handle and value이 있습니다.

값 클래스는 값으로 전달되며, 따라서 값 클래스에 쓸 때마다 복사됩니다. 또한, 메소드 호출은 'stick'에 대한 변경을 위해서는 obj = method(obj); 양식이어야합니다.

대조적으로 핸들 개체는 참조로 전달되므로 기본 작업 영역이나 함수의 작업 영역과 같은 작업 영역에서 개체를 수정할 때마다 개체가 어디에서나 변경됩니다. 따라서 호출 method(obj);obj이 명시 적으로 반환되지 않더라도 호출하는 작업 영역에서 obj을 변경합니다.

기본 클래스는 값 개체입니다. 당신이 핸들 객체를 사용하려는 경우, classdef 라인이 있어야한다 : 당신이 핸들 클래스를 서브 클래 싱하고

classdef myslice < handle 

즉.

1

이 상황에서 입력 내용과 동일한 이름을 사용하여 MATLAB에 무슨 일이 벌어지고 있는지에 대한 추가 정보를 제공 할 수 있습니다. 귀하의 예에서는 obj 사본을 만들지 않습니다. 이것은 항상 적절하지 않을 수 있습니다 (예 : obj.pts의 이전 값과 새 값이 다른 속성을 업데이트해야하는 경우).

%% Example Only 
obj = tripleAllPoints(obj) 
    obj.pts = obj.pts * 3; 
end 

(참조 : http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/)

관련 문제