2013-08-27 88 views
6

我正在寫作業,並使用Octave遇到此錯誤。它不會影響我的解決方案的功能,但我很好奇爲什麼會發出這個警告。在等尺寸矩陣上應用'自動廣播操作'

% X is column vector, p is max degree of polynom 
% example: 
% X = [1;2;3;4], p = 3 
% X_poly = [1,1,1; 2,4,8; 3,9,27; 4,16,64] 
function [X_poly] = polyFeatures(X, p) 

powers = ones(numel(X),1) * linspace(1,p,p); 
X_poly = X .^ powers; 

end 

問候,
湯姆

回答

3

啓動與此分析:

powers = ones(numel(X),1) * linspace(1,p,p); 

左邊的因素顯然是numel(X) -by- 1,而右邊的因素是1 -by- p ,並且您得到的矩陣是numel(X) -by- p

那麼這裏的問題:

X_poly = X .^ powers; 

左操作numel(X) -by- 1和正確的操作數是numel(X) -by- p。這些不匹配。

我認爲它應該只是一個錯誤,但八度顯然試圖找出你的意思,而不是你寫的東西,但然後給你一個警告,這是猜測。

要進行單身擴展,可以使用bsxfunrepmat

X_poly = bsxfun(@power, X, powers); 
X_poly = repmat(X, 1, p) .^ powers; 

由於分配powers只是做repmat一個混亂的方式,並bsxfun將擴大這兩個參數,可以改爲只是做:

X_poly = bsxfun(@power, X, 1:p); 

這使得有些無意義有一種特殊的功能爲此目的。

enter image description here

+0

那麼我可以使用bsxfun,但爲了鍛鍊,我想自己實現這種行爲。 唯一需要讓我的代碼工作的東西就是轉換X. (1,p,p); linspace(1,p,p); Xs = X * ones(1,p); X_poly = Xs^powers; 非常感謝;) –

+1

「我認爲它應該只是一個錯誤,但八度顯然是試圖找出你的意思,而不是你寫的,但然後給你一個警告,這是猜測」。這不是原因。 Octave語言的一部分是自動廣播(受NumPy啓發),所以你在這些情況下寫的是*廣播。警告的原因是這是一項新功能,可能讓人感到意外。這些類型的警告通常在2次發佈後被刪除。 – carandraug

+1

@carandraug:好的,這個問題也被標記爲'matlab',它在那裏是非法的。 –

12

自動廣播是一個相當新的倍頻功能,它拋出一個bsxfun只要有一個單身和非單身維度之間的尺寸不匹配。

在這種情況下

X_poly = X^powers;

替換

X_poly = bsxfun(@power,X,功率);

這是完全合法的八度行爲,而且它看起來正是你想要做的,所以你不要來改變它。

這個警告是因爲Matlab不支持自動廣播,所以他們想提醒你,如果你試圖在Matlab中運行這個代碼,它會失敗。

此外,許多Octave程序員的常見做法是主要依靠尺寸不匹配來檢測程序中的錯誤。我甚至曾經參加過一次機器學習課程,教授對全班教師說:「如果所有的維度排成一列,那麼這可能是正確的」。這是可怕的,可怕的建議,也是確保每個人都沒有完成家庭作業的肯定方式,但它確實反映了許多研究人員編寫Matlab/Octave程序時常見的方法。

由於這個原因,如果你不習慣對你的函數輸入作出明確的斷言,那麼沒有任何警告的情況下引入自動廣播可能會導致錯誤跟蹤困難。

如果你想擺脫的警告,你可以簡單地添加

warning("off", "Octave:broadcast"); 

你的代碼。

如果你想保持更好的兼容性Matlab的或只是不使用自動廣播,寧願倍頻錯誤,以幫助找出錯誤,你可以添加

warning ("error", "Octave:broadcast"); 

代替。

+0

+1用於添加有關與Matlab的兼容性的信息。 –