动态数据集数量的 MATLAB 图形绘制



有没有办法传入 N 个数据集并使用 for 循环将它们绘制在折线图中?我通过传递固定数量的参数(例如 M1、M2、M3、M4)并手动重复绘制来做到这一点,如下所示。但是我想知道是否有办法动态编码函数?假设我可以传入 4 个数据集或 40 个数据集,并通过循环将它们绘制在一个图中。

function plot_four_cdf(M1,M2,M3,M4)
[ycdf1,xcdf1] = cdfcalc(M1);
ycdf1 = ycdf1(2:length(ycdf1));
plot(xcdf1, ycdf1, '-+k', 'LineWidth', 1);
hold on;
[ycdf2,xcdf2] = cdfcalc(M2);
ycdf2 = ycdf2(2:length(ycdf2));
plot(xcdf2, ycdf2, '-ok', 'LineWidth', 1);
hold off;
hold on;
[ycdf3,xcdf3] = cdfcalc(M3);
ycdf3 = ycdf3(2:length(ycdf3));
plot(xcdf3, ycdf3, '-*k', 'LineWidth', 1);
hold off;
hold on;
[ycdf4,xcdf4] = cdfcalc(M4);
ycdf4 = ycdf4(2:length(ycdf4));
plot(xcdf4, ycdf4, '-sk', 'LineWidth', 1);
legend('M100','M80','M50','M20',...
   'Location','SE')
xlabel('Relative Error');
ylabel('CDF');
end

您可以将所有数据分组到一个单元格数组中,并将其传递给函数:

function plot_cdfs(M)
    figure, hold on
    linestyles = {...
        '-+k', '-ok', '-*k', '-sk', ...
        '-+r', '-or', '-*r', '-sr');
    legendentries = cell(size(M));
    for ii = 1:numel(M)
        [ycdf, xcdf] = cdfcalc(M{ii});
        plot(xcdf, ycdf(2:end), linestyles{ii}, 'LineWidth', 1);
        legendentries{ii} = ['M' num2str(ii)];    
    end
    legend(legendentries{:}, 'Location','SE')
    xlabel('Relative Error');
    ylabel('CDF');
end

请注意,M构造如下

M = {M1, M2, M3, ...} 

可能也处于自己的循环中。另请注意,legendentries现在很难定义。您可以将它们作为单独的参数传递给函数(更好的选择),或者将它们填充在它们描述的数据旁边的同一个单元格数组M(不是很可移植)。

另请注意,您必须进行一些错误检查(现在,只能制作 8 个不同的图。如果执行更多操作,将导致错误)。

最新更新