2013-08-27 42 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的兼容性的信息。 –