2017-03-05 171 views
0

我的代碼工作,當我鍵入MATLAB如果函數和,矩陣尺寸必須同意錯誤

if size(k)==size(k1) 
    disp('They match'); 
end 

if k-k1==0 
    disp('They match'); 
end 

,但如果我在兩個條件同時這樣的,

鍵入
if size(k)==size(k1) & k-k1==0 
    disp('They match'); 
end 

我得到一個錯誤說

矩陣尺寸必須一致。

錯誤在實踐中(第32行),如果大小(k)的大小==(K1)& K-K1 == 0

FYI,的k和​​尺寸均爲1x717兩倍。我檢查了它。

所以我想製作一個if語句,它同時包含兩個條件,但是我遇到了一個錯誤。兩個&&將無法​​正常工作兩個&&是標量,但我的k和​​是向量。

當你比較兩個向量的結果也將是一個向量(矢量邏輯)任何幫助將不勝感激

回答

1

,而是一個if條件接受標邏輯值,所以你可以使用all功能。

if all(size(k)-size(k1)==0) && all(k-k1==0) 
    disp('They match'); 
end 

你應該總是在一個循環中使用&&,「&」僅用於邏輯運算和。

我測試了這一點,它的工作原理:

k = rand(1,10); 
k1 = k; 

if all(size(k)-size(k1)==0) && all(k-k1==0) 
    disp('They match'); 
end 

,因爲當你這樣做:

>> k-k1==0 

ans = 

    1×10 logical array 

    1 1 1 1 1 1 1 1 1 1 

所以if不知道指的是價值。但是當你做

>> all(k-k1==0) 

ans = 

    logical 

    1 

它給出了矢量的所有元素的唯一答案。


重要提示:

比較數字是不是在循環決策是一個好主意,因爲Floating Point Error problem的。

一個更好的戰爭來處理它

如果你閱讀有關浮點錯誤的問題,你會看到,有時, 2.000 == 2.000結果false。爲了解決這個問題,你可以做如下:

tolerance = 0.0001; 
if all(size(k)-size(k1)==0) && all(abs(k-k1)<=tolerance) 
    disp('They match'); 
end 

你首先取決於你試圖解決,然後,而不是減法比較爲零的問題的性質定義可接受的公差值,你比較抽象的絕對價值的寬容。因此,諸如23.000123.000的數字將被視爲相等。

0

問題是size(k)size(k1)返回1 * 2個向量(行數和列數),所以size(k)==size(k1)返回兩個值。另一方面,k-k1==0僅返回與k & k1具有相同維度的邏輯矩陣。

例如,如果k == k1,你會期望兩者相等。

size(k)==size(k1) % returns 1 1 
k == k1 % returns 1 

if [1 1] && 1 % gives erros 

或者,使用isequal即使尺寸不匹配也不會給出錯誤。

isequal(k,k1) % returns 1 if equal, 0 otherwise. 
+1

k-k1 == 0不返回一個值,它返回一個大小爲'k'的向量。 – NKN

+0

@NKN,是的,我不小心。現在更新了,謝謝 – smttsp

+0

很酷,感謝編輯。 – NKN

相關問題