将matlab的figure保存为pdf,避免图片太大缺失

有时画的matlab图太大,或者有太多的子图,导致图太宽,如果直接保存成pdf的话,会导致左右边丢失,显示不下。一个有效又简单的办法是:
 

1、在matlab figure里面,Edit -> Copy Figure

2、在adobe acrobat里面,文件->创建PDF->从剪贴板。

就这么简单,根本无需什么eps2pdf,什么illustrator打印之类的

 

from: http://blog.sciencenet.cn/blog-242887-642730.html

http://hi.baidu.com/seuliu/item/e5931ceebaceb90f8c3ea827

<think>嗯,用户让我用MATLAB完成一个关于泊松过程的实验,包括生成、存储时间、统计次数以及验证是否符合泊松分布。首先,我需要回忆泊松过程的定义和生成方法。泊松过程的事件发生是独立且速率λ恒定的,所以事件间隔时间应该服从指数分布,参数是λ的倒数。对吗?对,生成泊松过程通常是通过生成独立同分布的指数随机变量作为间隔时间,然后累加得到事件发生时间。 那第一步,用户需要生成λ=2的泊松过程。MATLAB中可以用exprnd函数生成指数分布的间隔时间。例如,exprnd(1/λ)生成每个间隔时间。但需要生成足够多的事件,使得总时间覆盖一定时长,比如T=1000单位时间,这样统计次数时数据量足够大。或者,用户可能需要生成在固定时间段内的事件,比如模拟到时间T为止的事件。这里可能需要先确定模拟的时间长度,或者生成足够多的事件直到覆盖某个时间段。不过用户可能更关心单位时间内的事件次数,所以可能需要在多个单位时间段内统计事件数,比如分成多个1小时的区间,统计每个区间的发生次数,然后比较是否与泊松分布吻合。 接下来,存储事件发生的时间。生成间隔时间后,使用cumsum函数累加得到事件发生的时间点。例如,首先生成多个间隔时间,直到总时间超过模拟的总时长,然后截断。比如,设置总时间T,生成间隔直到总和超过T,然后去掉最后一个间隔,这样事件时间点就存储在数组里了。 统计单位时间内事件发生的次数,这需要将时间轴划分为单位时间的区间,比如[0,1), [1,2), ..., [k, k+1),然后统计每个区间内的事件数量。这可以通过histcounts函数实现,设置边长为1:max_time的整数,或者根据事件时间进行分箱。得到每个区间的计数后,统计各次数出现的频率,与泊松分布的理论概率进行比较。 验证是否吻合,可以用卡方检验或者直观的比较直方图与理论概率。对于卡方检验,需要计算每个区间的实际频数和理论频数,然后计算统计量。但可能用户只需要图形化的比较,比如画出直方图和理论泊松分布的PMF,观察是否接近。或者使用K-S检验,不过泊松是离散分布,卡方可能更合适。 需要注意的几点:生成的事件时间要足够多,以确保统计的有效性。比如模拟足够长的时间,比如总时间T=1000单位时间,这样每个单位时间的事件数大约有2000个样本?或者每个单位时间的事件数平均是λ=2,所以总共有约2000个样本?或者可能用户希望每个时间单位作为一个样本点,比如总时间T=1000的话,有1000个样本点,每个样本点的计数服从Poisson(2)。但泊松过程是连续时间的,所以需要正确分箱。 可能的MATLAB步骤: 1. 生成间隔时间:intervals = exprnd(1/2, 1, N),但N需要足够大,可能需要动态生成直到总时间达到某个值,比如T=1000。例如: times = []; t = 0; while t < T interval = exprnd(1/2); t = t + interval; times = [times, t]; end 但这样最后一个时间可能超过T,所以需要去掉超过的部分。或者用循环生成直到t >= T,然后截断之前的times数组。比如: times = cumsum(intervals); times = times(times <= T); 不过这样需要预先生成足够多的intervals,可能效率不高。或者使用动态生成: times = []; current_time = 0; while true interval = exprnd(1/λ); current_time = current_time + interval; if current_time > T break; end times = [times, current_time]; end 这样更有效,避免生成过多数据。 然后,存储这些times数组。 接下来,统计单位时间内的次数。假设总时间T是整数,比如T=1000,这样就可以分成1000个单位时间区间。使用histcounts: edges = 0:1:T; counts = histcounts(times, edges); 这样counts将是一个长度为T的数组,每个元素是相应单位时间内的事件数。例如,counts(1)是[0,1)时间内的事件数,以此类推。 然后,统计每个k的出现次数,比如k=0,1,2,...,计算频率。然后与泊松分布的理论概率比较,λ=2。 理论概率可以用poisspdf(k, λ),计算每个k的概率,然后乘以总单位时间数(比如T=1000)得到理论频数。 最后,画图比较实际频数和理论频数,或者进行卡方检验。 可能的代码结构: lambda = 2; T = 1000; % 总时间 % 生成事件时间 event_times = []; current_time = 0; while current_time < T interval = exprnd(1/lambda); current_time = current_time + interval; if current_time < T event_times(end+1) = current_time; end end % 统计每个单位时间的事件数 edges = 0:1:T; counts = histcounts(event_times, edges); % 统计各次数出现的频数 max_count = max(counts); observed = histcounts(counts, 0:max_count+1); % 或者用 histcounts的bin设为整数0到max_count observed_counts = 0:max_count; observed_freq = histcounts(counts, [observed_counts, max_count+1]); % 或者更简单的方式,使用tabulate函数: count_table = tabulate(counts); observed_freq = count_table(:,2); % 但tabulate可能返回从最小到最大的数值,需要处理可能的缺失值。 % 计算理论频数 k_values = 0:max_count; theory_prob = poisspdf(k_values, lambda); theory_freq = theory_prob * sum(observed_freq); % 总共有sum(observed_freq)个样本点,即T单位时间 % 画图 figure; hold on; histogram(counts, 'Normalization', 'pdf'); plot(k_values, theory_prob, 'ro-'); xlabel('事件次数'); ylabel('概率密度'); legend('实际统计', '理论泊松分布'); title('单位时间内事件次数分布验证'); % 卡方检验 expected = theory_prob * length(counts); % 每个k的理论期望次数 observed_adj = observed_freq(1:length(expected)); % 调整长度 % 需要确保所有expected >=5,否则合并区间 % 这里可能需要处理尾部,比如将大于某个k的合并 chi2stat = sum((observed_adj - expected).^2 ./ expected); dof = length(expected) -1 -1; % 参数估计用了lambda吗?这里lambda是已知的,所以自由度是n-1 p_value = 1 - chi2cdf(chi2stat, dof); 需要注意的潜在问题: 1. 生成的事件时间是否正确:确保每个间隔时间独立且参数正确。 2. 分箱是否正确:特别是当T很大时,histcounts的分箱是否准确。 3. 理论频数和实际频数的计算是否对齐。 4. 卡方检验的应用条件,比如期望频数不能太低,可能需要合并高次数的区间。 5. 绘图时是否归一化,比如使用'pdf'选项让直方图显示概率密度,与理论概率比较。 另外,用户可能需要存储事件发生的时间,即保存event_times变量。这部分可以通过MATLAB的save函数或者直接输出到文件,但用户可能只需要在代码中保留该变量。 可能的改进点: - 可以调整模拟的总时间T,如更大的T会更准确。 - 在卡方检验中处理期望频数过低的情况。 - 检查生成的event_times是否符合指数间隔。 现在,把这些步骤整理成结构化的回答,确保用户能逐步理解和实现实验。</think>以下是使用MATLAB完成泊松过程实验的详细步骤: --- ### **实验步骤解析** #### **一、泊松过程生成原理** 泊松过程满足以下性质: 1. 事件发生间隔时间服从指数分布,参数为$\lambda$ 2. 单位时间内事件次数服从泊松分布$P(k) = \frac{\lambda^k e^{-\lambda}}{k!}$ #### **二、MATLAB代码实现** ```matlab %% 实验参数设置 lambda = 2; % 泊松过程参数 T = 1000; % 总模拟时长(单位时间) rng(0); % 固定随机种子,确保结果可复现 %% 步骤1:生成泊松过程事件时间 event_times = []; % 存储事件发生时间 current_time = 0; % 当前时间初始化 while current_time < T interval = exprnd(1/lambda); % 生成指数分布间隔时间 current_time = current_time + interval; if current_time < T event_times = [event_times, current_time]; % 存储有效事件时间 end end %% 步骤2:统计单位时间内事件次数 % 划分单位时间区间 edges = 0:1:T; counts = histcounts(event_times, edges); % 统计每个单位时间的事件数 %% 步骤3:绘制实际分布与理论泊松分布对比 max_k = max(counts); k_values = 0:max_k; % 计算实际频率 observed_freq = histcounts(counts, [k_values, max_k+1]); observed_prob = observed_freq / sum(observed_freq); % 计算理论概率 theory_prob = poisspdf(k_values, lambda); % 绘制对比图 figure; hold on; bar(k_values, observed_prob, 'FaceAlpha', 0.5); plot(k_values, theory_prob, 'ro-', 'LineWidth', 2, 'MarkerSize', 8); xlabel('单位时间内事件发生次数 k'); ylabel('概率'); legend('实际统计', '理论泊松分布'); title('泊松过程分布验证 (λ=2)'); grid on; %% 步骤4:卡方拟合优度检验 alpha = 0.05; % 显著性水平 expected = theory_prob * sum(observed_freq); % 理论频数 % 合并尾部确保期望频数≥5 valid_bins = expected >= 5; chi2stat = sum((observed_freq(valid_bins) - expected(valid_bins)).^2 ./ expected(valid_bins)); dof = sum(valid_bins) - 1 - 1; % 自由度 = 有效区间数 - 估计参数数量 (此处λ已知,不占用自由度) p_value = 1 - chi2cdf(chi2stat, dof); % 输出检验结果 fprintf('卡方统计量: %.4f\n', chi2stat); fprintf('P值: %.4f\n', p_value); if p_value > alpha fprintf('无法拒绝原假设,分布与泊松分布吻合\n'); else fprintf('拒绝原假设,分布与泊松分布不吻合\n'); end ``` --- ### **关键步骤说明** 1. **事件时间生成** - 利用`exprnd(1/lambda)`生成指数分布的间隔时间,累加得到事件发生时间序列。 - 循环终止条件`current_time < T`确保总时长不超过设定值。 2. **次数统计** - 通过`histcounts`将事件时间划分到单位时间区间,统计每个区间的计数。 3. **分布验证** - **图形对比**:直方图显示实际频率,红色曲线为理论泊松分布。 - **卡方检验**:定量验证分布吻合度,合并低频区间确保检验有效性。 --- ### **预期结果示例** - 图形中实际频率(蓝色柱状图)与理论概率(红色曲线)应高度重叠。 - 卡方检验输出`P值 > 0.05`时,说明统计结果与泊松分布无显著差异。 --- ### **常见问题处理** 1. **结果波动较大** - 增加总时长`T`(例如设置为10,000)以提高统计稳定性。 2. **卡方检验失败** - 检查是否因随机种子导致异常样本,尝试更换`rng(seed)`重新实验。 3. **事件时间存储优化** - 预分配数组提升效率: ```matlab event_times = zeros(1, round(2*T*lambda)); % 预分配空间 pointer = 1; while current_time < T interval = exprnd(1/lambda); current_time = current_time + interval; if current_time < T event_times(pointer) = current_time; pointer = pointer + 1; end end event_times = event_times(1:pointer-1); % 截断多余空间 ``` --- 通过以上步骤,可完整实现泊松过程的生成、存储与分布验证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值