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

问候,
汤姆

4

2 回答 2

12

自动广播是一个相当新的 Octave 功能,只要单例和非单例维度之间存在维度不匹配,就会引发 bsxfun。

在这种情况下

X_poly = X .^ 次幂;

被替换为

X_poly = bsxfun(@power, X, powers);

这是完全合法的八度音阶行为,而且它似乎正是您想要做的,因此您根本不必更改它。

警告是因为 Matlab 不支持自动广播,所以他们想提醒您,如果您尝试在 Matlab 中运行此代码,它将失败。

此外,许多 Octave 程序员的常见做法是主要依靠大小不匹配来检测程序中的错误。我什至曾经参加过机器学习课程,教授对全班同学说“如果所有维度都对齐,那么它可能是正确的”。这是一个非常糟糕的建议,也是确保每个人都没有完成家庭作业的可靠方法,但它确实反映了许多研究人员编写 Matlab/Octave 程序的共同方法。

出于这个原因,如果您没有对函数输入做出明确断言的习惯,那么在没有任何警告的情况下引入自动广播可能会给您带来错误跟踪的困难。

如果你想摆脱警告,你可以简单地添加

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

到你的代码。

如果您想保持更好的 Matlab 兼容性或者只是不使用自动广播并且宁愿使用 octave 错误来帮助隔离错误,您可以添加

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

反而。

于 2013-09-03T16:24:10.237 回答
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。这些不匹配。

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

要执行单例扩展,您可以使用bsxfunrepmat

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

由于分配 topowers只是一种混乱的方式repmat,并且bsxfun会扩展两个参数,因此您可以改为:

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

这使得为​​此目的具有特殊功能有些毫无意义。

在此处输入图像描述

于 2013-08-27T22:14:00.917 回答