MATLAB中无需循环生成卡方分布随机数数组的方法
无需迭代生成多自由度卡方分布样本并存储为元胞数组的方法
嘿,当然有不用迭代的实现方式啦!你的循环写法完全可行,但MATLAB里有更高效的向量化思路,能轻松得到你想要的元胞数组,而且代码更简洁。
核心思路:先向量化生成所有样本,再转成元胞数组
chi2rnd函数支持输入矩阵形式的自由度参数——每一行对应一组自由度,它会一次性生成对应位置的样本。我们可以利用这一点直接生成所有样本,再拆分到元胞中:
生成N×4的样本矩阵
把你需要的自由度数组[df1 df2 df3 df4]重复N行,作为chi2rnd的输入,这样就能直接得到N组(每组4个)卡方分布样本:samples_matrix = chi2rnd(repmat([df1 df2 df3 df4], N, 1));如果你用的是MATLAB R2020b及以上版本,还可以用广播机制替代
repmat,代码更简洁:samples_matrix = chi2rnd([df1 df2 df3 df4] + zeros(N, 1));将矩阵转换为元胞数组
用num2cell函数并指定按行拆分(第二个参数设为2),这样矩阵的每一行就会变成一个元胞元素,和你原来循环生成的x完全一致:x = num2cell(samples_matrix, 2);
为什么cellfun没成功?
cellfun的定位是对已存在的元胞数组中的每个元素执行函数操作,而不是用来生成新的元胞数组,所以用它来完成样本生成的任务并不合适,这也是你尝试失败的原因。
另一种简洁写法(底层仍为循环,但代码更短)
如果你偏好类似函数式的写法,也可以用arrayfun,不过它本质上和你原来的循环是一样的,效率没有向量化方法高:
x = arrayfun(@(~) chi2rnd([df1 df2 df3 df4]), 1:N, 'UniformOutput', false);
内容的提问来源于stack exchange,提问作者Claire L.
相关产品推荐
相关产品推荐

