2012-03-08 2 views
0

dual numbers을 처리 할 Matlab 클래스를 작성하여 automatic differentiation을 수행했습니다. 거의 모든 경우에 이것은 잘 작동하며 새로운 클래스는 대부분의 함수에서 다른 숫자 클래스를 대체합니다 (필드 'x'는 함수의 값을 제공하고 필드 d는 파생 된 값을 제공합니다. 그 때의 함수).할당 연산자의 왼쪽 부분 승격

>> x = mkdual([1 2 3]); 
>> x.^2 
ans = 
    Dual 

    Properties: 
    x: [1 4 9] 
    d: [2 4 6] 

그러나, 함수 출력의 배열은 사전 - 할당 실패시, 그리고 그것으로 인덱싱하여 배열에 할당한다.

>> x=mkdual(1); 
>> y(2,:)=x 
??? The following error occurred converting from Dual to double: 
Error using ==> double 
Conversion to double from Dual is not possible. 
: 그것은 이중 번호로 할당 연산자의 좌측에 배열을 촉진 할 수 없기 때문에

>> y=zeros(2) // Pre-allocate for speed 
y = 
    0  0 
    0  0 
>> x = 1; 
>> y(1,:)=x 
y = 
    1  1 
    0  0 

불행하게도이, 내 수업에 실패 예를 들어, 다음은 매트랩 일반적인 패턴이다

누구나 수정이나 해결 방법을 제안 할 수 있습니까? yDual으로 자동 승격시킬 수있는 방법이 있습니까?

답변

2

; x을 double로 변환하려고 시도했기 때문에 실패했습니다.

변환 작업을 수행하려는 에 오버플로 된 double 메서드를 추가 할 수 있습니다.

나는 그것이 당신이 원하는 것이 아니라고 생각하지만 오히려 당신은 클래스 Dual의 더미 요소의 배열을 미리 할당하는 방법을 원한다. 이를 수행하려면 Dual의 생성자를 설계하여 입력 인수없이 실행하여 더미 또는 기본값 Dual을 반환합니다. 그러면 y(2,2) = Dual이라고 말하면서 미리 할당 된 2x2 더미 배열 Dual을 갖게됩니다.

전체 예제를 보려면 문서에서 '값 개체 배열 초기화'를 검색하십시오.

또는 y을 배열 대신 셀 배열로 만들 수 있습니다.

+0

깔끔한 아이디어입니다. 감사합니다. –

1

변수를 전체로 바꾸지 않는 한 (사전 할당의 이점을 상실하는) yDual으로 자동 승격 할 수 없습니다.

그러나 처음에는 이중으로 사전 할당 할 수 있어야합니다. 나는 구문의 확실하지 않다, 그것은 구현에 따라 달라질 수 있지만, 뭔가 같은 : 또는

mkdual(zeros(10,10)) 

, 당신은 뒤쪽 루프에 의해 게으른 미리 할당 할 수 있습니다. 그 대신

for ix = 1:100 
    y(ix) = mkdual(...) 
end 

사용 중입니다

그것은 Dualy을 촉진 할 수 없기 때문에 귀하의 예를 실패하지 않습니다
for ix = 100:-1:1 
    y(ix) = mkdual(...) 
end 
+0

답변 해 주셔서 감사합니다. 관련 기능을 이중 할당 번호로 사용하는 '이중 버전'으로 일부 기능을 다시 작성할 수 있습니다. 함수에 대한 변경없이 인수로서 이중 배열에 놓을 수있는 솔루션이있을 것을 기대했지만, 아쉽게도 그렇게 보이지 않습니다.받아 들일 수있는 '차선책'은 일반 및 이중 전화 번호로 작업 할 수 있도록 기능을 다시 조정하는 것이지만 가능한 방법은 확실하지 않습니다. –

관련 문제