我正在写作业,我使用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
Run Code Online (Sandbox Code Playgroud)
问候,
汤姆
dsp*_*pyz 12
自动广播是一种相当新的Octave功能,只要在单例和非单例维度之间存在尺寸不匹配,就会抛出bsxfun.
在这种情况下
X_poly = X.^幂;
被替换为
X_poly = bsxfun(@ power,X,powers);
这是完全合法的倍频行为,并进一步将其似乎正是你想做的事,所以你不要有改变它.
警告是因为Matlab不支持自动广播,因此他们想要提醒您,如果您尝试在Matlab中运行此代码,则会失败.
此外,许多Octave程序员的常见做法是主要依靠大小不匹配来检测程序中的错误.我甚至曾经参加了一个机器学习课,教授对整个班级说"如果所有尺寸都排成一行,那么它可能是正确的".这是一个糟糕的,可怕的建议,也是确保每个人都不通过家庭作业的可靠方法,但它确实反映了许多研究人员编写Matlab/Octave程序的常用方法.
因此,如果您不习惯对函数输入做出明确的断言,那么在没有任何警告的情况下引入自动广播可能会导致错误跟踪困难.
如果你想摆脱警告,你可以简单地添加
warning("off", "Octave:broadcast");
Run Code Online (Sandbox Code Playgroud)
你的代码.
如果你想保持更好的Matlab兼容性或者只是不使用自动广播而宁愿有八度错误来帮助隔离bug,你可以添加
warning ("error", "Octave:broadcast");
Run Code Online (Sandbox Code Playgroud)
代替.
以此开始分析:
powers = ones(numel(X),1) * linspace(1,p,p);
Run Code Online (Sandbox Code Playgroud)
左边的因子显然是numel(X)-by- 1,右边的因子是1-by- p,你会得到一个numel(X)-by-的矩阵p。
那么问题来了:
X_poly = X .^ powers;
Run Code Online (Sandbox Code Playgroud)
左操作数是numel(X)-by- 1,右操作数是numel(X)-by- p。这些不匹配。
我认为这应该只是一个错误,但八度显然试图弄清楚你的意思而不是你写的内容,但然后给你一个警告,它正在猜测。
要执行单例扩展,您可以使用bsxfun或repmat。
X_poly = bsxfun(@power, X, powers);
X_poly = repmat(X, 1, p) .^ powers;
Run Code Online (Sandbox Code Playgroud)
由于分配 topowers只是一种混乱的方式repmat,并且bsxfun会扩展两个参数,因此您可以这样做:
X_poly = bsxfun(@power, X, 1:p);
Run Code Online (Sandbox Code Playgroud)
这使得为此目的设置特殊功能有些毫无意义。
