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