我从NumPy
回到MATLAB
,在这里不太熟悉广播的技巧。有人能给我解释一下为什么第一个失败了,第二个(更明确的作品)?经过我的理解,x0
和x1
都是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);