我想盡量減少Matlab中的總和((A-r * B)。^ 2)A和B是矩陣,r是我操縱的標量。我試了下面的代碼:在Matlab中找到以下函數的最小值
f = @(r) sum((A-r*B).^2);
Answer = fminbnd(f,lowrange,highrange);
但是我得到一個錯誤。
我想盡量減少Matlab中的總和((A-r * B)。^ 2)A和B是矩陣,r是我操縱的標量。我試了下面的代碼:在Matlab中找到以下函數的最小值
f = @(r) sum((A-r*B).^2);
Answer = fminbnd(f,lowrange,highrange);
但是我得到一個錯誤。
如果A
和B
是矩陣,那麼sum((A - r*B).^2)
將而不是給你一個單一的值。這會給你一個數組的值。如果sum
的輸入是矩陣,則sum
的輸出將爲您提供一個數組,其中每個元素是矩陣中每列的行數。
您指定的功能爲fminbnd
必須將評估爲單個值。我假設你想確定你的函數的平方差的總和,所以你需要用來包裝sum
另一個sum
。因此,嘗試此相反:
f = @(r) sum(sum((A-r*B).^2));
Answer = fminbnd(f,lowrange,highrange);
功能f
會發現現在的矩陣A
和B
這是由r
加權之間的差別,方這些差異,然後加起來所有這些差異在一起。
試試看看它是否有效。
如果您不需要對優化標量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。即使沒有完美的解決方案,這也應該可以正常工作,就像上面的例子一樣。
你得到的錯誤是什麼? – MrAzzaman 2014-09-29 02:37:40
||的操作數和&&操作符必須可以轉換爲邏輯標量值。錯誤fminbnd(line314) - if((fu <= fw ||(w == xf)) – 2014-09-29 02:38:50
你可以給出一個小的可運行的例子來顯示這個錯誤:使用隨機的5x5矩陣作爲'A'和'B',在0到10之間最小化,我得到了一個不同的錯誤,因爲你的目標函數沒有返回標量 – David 2014-09-29 04:25:57