MATLAB广播统一



我从NumPy回到MATLAB,在这里不太熟悉广播的技巧。有人能给我解释一下为什么第一个失败了,第二个(更明确的作品)?经过我的理解,x0x1都是1x2数组,应该可以扩展到5x2

n_a = 5;
n_b = 2;
x0 = [1, 2];
x1 = [11, 22];
% c = unifrnd(x0, x1, [n_a, n_b])
% Error using unifrnd
% Size information is inconsistent.
% c = unifrnd(x0, x1, [n_a, 1])  % also fails
c = unifrnd(ones(n_a, n_b) .* x0, ones(n_a, n_b) .* x1, [n_a, n_b])
% works

unifrnd函数中有一个大小验证(您可以在命令行中输入open unifrnd以查看函数代码)。如果第三个输入与前两个输入的大小不一致,则发送错误:

[err, sizeOut] = internal.stats.statsizechk(2,a,b,varargin{:});
if err > 0
    error(message('stats:unifrnd:InputSizeMismatch'));
end

如果您跳过这一部分(例如,如果您创建一个没有大小检查的自定义函数),由于隐式扩展,失败的函数调用实际上都将工作。真正的问题是这样调用函数是否有意义。

TL;DR:不是广播失败,而是功能不允许这些输入集

unifrnd实际上调用rand并应用缩放和移动到所需的间隔。因此,您可以使用rand并手动进行缩放和移动,这允许您使用广播(单例扩展):

c = x0 + (x1-x0).*rand(n_a, n_b);

相关内容

  • 没有找到相关文章

最新更新