在同等大小的矩阵上应用“自动广播操作”

时间:2013-08-27 21:16:06

标签: octave

我正在写作业,我使用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

的问候,
汤姆

2 个答案:

答案 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)。这些不匹配。

我认为它应该只是一个错误,但八度显然试图弄清楚你的意思而不是你所写的内容,但随后会给你一个警告它正在猜测。

要执行单身人士扩展,您可以使用pbsxfun

repmat

由于分配到X_poly = bsxfun(@power, X, powers); X_poly = repmat(X, 1, p) .^ powers; 只是处理powers的混乱方式,而repmat会扩展这两个参数,您可以改为:

bsxfun

这使得为此目的使用特殊功能有点无意义。

enter image description here