Matlab生成半随机绘图遇语法与逻辑问题求助
问题分析与解决方案
原代码的核心错误
- 样本类型错误:用cell数组存储数值,导致
randsample返回cell元素,无法直接做比较(outcome>0)和算术运算,完全没必要,改用数值数组即可。 - 采样函数使用错误:
randsample对cell数组支持有限,直接传入数值数组才能正确返回单个采样值。 - 逻辑混乱:原代码里
z=i、outcome(z)=(2^z)*outcome属于无意义操作——outcome是单个值,不能用索引访问,且逻辑完全不符合“选中负值时后续取翻倍值”的需求。 - 结果存储错误:仅在第一次循环时赋值
result,后续循环未追加结果,最终result只保留第一次采样值。 - 语法错误:
b = outcome:outcome(100)、plot result;、多余的end都是语法错误,无法运行。
修正后的代码(符合需求版本)
以下代码实现:初始样本为[-1,1.5,2,2.5],每次随机采样,若选中负值则将样本中的该负值更新为翻倍值(确保后续选中时为翻倍后的值),同时记录本次结果;选中正值则直接记录原值,样本保持不变。
% 初始化数值型样本数组(替代原cell数组) sample = [-1, 1.5, 2, 2.5]; % 预分配结果数组,存储100次采样结果 result = zeros(1, 100); for i = 1:100 % 从样本中随机选取1个数值 selected_val = randsample(sample, 1); if selected_val < 0 % 找到样本中负值的位置,将其翻倍更新(实现后续选中翻倍值的需求) neg_index = find(sample < 0); sample(neg_index) = sample(neg_index) * 2; % 记录本次采样的结果(更新后的负值) result(i) = sample(neg_index); else % 选中正值,直接记录原值 result(i) = selected_val; end end % 计算结果总和 total_sum = sum(result); disp(['100次采样结果总和:', num2str(total_sum)]); % 绘制采样结果序列 plot(result, 'b-', 'LineWidth', 1.2); xlabel('采样次数'); ylabel('采样结果'); title('100次采样结果变化序列'); grid on;
代码说明
- 样本类型修正:改用数值数组
sample = [-1, 1.5, 2, 2.5],避免cell数组带来的额外处理成本。 - 结果存储优化:预分配
result数组,每次循环将结果存入对应索引位置,确保所有采样结果都被记录。 - 逻辑实现:当选中负值时,更新样本中的该负值为翻倍值,这样后续采样时该值就是翻倍后的版本,完全符合“后续选中该值的翻倍值”的需求;选中正值则直接记录原值。
- 语法修正:修复绘图语法,添加坐标轴标签和网格,提升可视化效果;移除多余的
end,确保代码可正常运行。
可选版本(仅本次结果翻倍,样本不更新)
若需求是“每次选中负值时,本次结果为该值的翻倍值,但样本保持不变,后续选中仍为原负值”,可使用以下代码:
sample = [-1, 1.5, 2, 2.5]; result = zeros(1, 100); for i = 1:100 selected_val = randsample(sample, 1); if selected_val < 0 % 本次结果为负值的翻倍值,样本不更新 result(i) = selected_val * 2; else result(i) = selected_val; end end total_sum = sum(result); disp(['100次采样结果总和:', num2str(total_sum)]); plot(result, 'r-', 'LineWidth', 1); xlabel('采样次数'); ylabel('采样结果'); title('采样结果序列(仅本次翻倍)'); grid on;
内容的提问来源于stack exchange,提问作者Peiman Ghasemi
相关产品推荐
相关产品推荐

