2014-09-29 4 views
0

Matlab에서 sum ((A-r * B).^2)을 최소화하려고합니다. 여기서 A와 B는 행렬이고 r은 내가 조작하고있는 스칼라입니다. 다음 코드를 시도 :Matlab에서 다음 함수 찾기 최소

f = @(r) sum((A-r*B).^2); 
Answer = fminbnd(f,lowrange,highrange); 

오류가 발생합니다.

+0

무엇이 오류입니까? – MrAzzaman

+0

||에 피연산자 및 && 연산자는 논리 스칼라 값으로 변환 가능해야합니다. fminbnd (line314) 오류 - if ((fu <= fw || (w == xf)) –

+0

이 오류를 보여주는 작은 실행 가능한 예제를 제공 할 수 있습니까? A와 B에 임의의 5x5 행렬을 사용하고 0과 10 사이의 최소화, 목적 함수가 스칼라를 반환하지 않기 때문에 나는 다른 오류가 발생했습니다. – David

답변

2

만약 AB이 행렬이며, 다음 sum((A - r*B).^2) 것이다 당신에게 하나의 값을 제공하지. 그러면 배열 값을 갖습니다. sum에 대한 입력이 행렬 인 경우 sum의 출력은 각 요소가 행렬의 각 열에 대한 행의 합계 인 배열을 제공합니다.

fminbnd으로 지정하는 함수는이 하나의 값으로 계산되어야합니다. 나는 당신이 함수의 제곱 차이의 합을 결정하려고한다고 가정하고 sum또 다른sum으로 감쌀 필요가 있습니다. ,

f = @(r) sum(sum((A-r*B).^2)); 
Answer = fminbnd(f,lowrange,highrange); 

기능 f 지금 행렬 Ar에 의해 가중되는 B의 차이를 발견 할 것이다 이러한 차이를 제곱 한 후 함께 이러한 차이의 모두를 추가 : 따라서,이 대신하려고합니다.

시도해보고 작동하는지 확인하십시오.

0

최적화 된 스칼라 r의 가능한 값에 제한을 두지 않아도되는 경우 최소한을 검색하지 않고이 방정식을 직접 해결할 수 있어야합니다. A와 B는 벡터를 사용하는 경우 :

ropt=(B'*B)^(-1)*B'*A; 

A와 B가 배열이고, 당신이 배열의 모든 요소의 제곱 잔차의 합을 최소화하려면 다음 내가 다음은 (같은 공식을 작동합니다 생각은하지만, A와 B를 벡터로 변환).

ropt=(B(:)'*B(:))^(-1)*B(:)'*A(:); 

예 : 매트릭스에 대해 유사

를 원하는

b=[1;2;3] 
    a=2*b; 
    ropt=(b'*b)^(-1)*b'*a 

반환 ropt = 2.0000 :

b=magic(3); 
    a=2*b; 
    ropt=(b(:)'*b(:))^(-1)*b(:)'*a(:) 

도 ropt를 반환 = 2.0000. 위의 예제 에서처럼 완벽한 솔루션이 없어도 제대로 작동합니다.