一种基于MATLAB的广播技术

bakd9h0s  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(232)

我从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
nnsrf1az

nnsrf1az1#

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

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

但是,如果您跳过这一部分(例如,如果您创建了一个没有大小检查的自定义函数),由于隐式扩展,失败的两个函数调用都将实际工作。真正的问题是以这种方式调用函数是否有意义。
TL;DR:不是广播失败,而是功能不允许你输入这些集合

e5njpo68

e5njpo682#

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

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

相关问题