首页 文章

MATLAB:限制绘制值的范围

提问于
浏览
0

我根本不是Matlab用户,但我现在只是试图使用它创建一个快速而肮脏的2D绘图来说明相对O符号的复杂性,以避免手工绘制它 . 我使用的是Matlab版R2010b,我没有额外的工具包 . 我的问题包括两部分 . 我想在同一块情节中绘制以下案例:

O(1)
O(lg2 n)
O(n)
O(n lg2 n)
O(n * n)
O(2 ^ n)
O(n!)

我的代码在这篇文章的最后 .

问题1:虽然我已经根据需要指定了n和我的轴限制的值范围,但显然n平方和n因子的值将大大超过所需的y轴范围 . 当发生这种情况时,它会大大压缩y轴图,以适应该范围的输出 . 如何指定y轴的值不应超过y轴本身所需范围的所需范围?

问题2:在我的下面的代码中,表达式n * log2(n)导致错误,指出“内部矩阵尺寸必须一致” . 当我尝试通过简单地执行n * n来计算n平方时,我得到了相同的错误,但我能够通过将其更改为n来确定 . ^ 2 . 表达n * log2(n)的正确方法是什么?

谢谢,雷

grid on
axis([0,40,0,200]);
n = 0:1:40;

O_1 = 0;
O_log2_n = log2(n);
O_n = n;
O_n_log2_n = n * log2(n);    % Doesn't work this way
O_log2_nSq = n.^2;
O_log2_nFact = factorial(n);

plot(n, O_1, n, O_log2_n, n, O_n, n, O_n_log2_n, n, O_log2_nSq, n, O_log2_nFact);

text(37, 37, '   O(n)', 'HorizontalAlignment','left','FontSize',12);
set(gca, 'XTick', [0, 10, 20, 30, 40]);
set(gca, 'YTick', [0, 50, 100, 150, 200]);
xlabel('n','FontSize',16);
ylabel('T(n)','FontSize',16);
title('\it{Comparative algorithm growth rates}','FontSize',16);

2 回答

  • 0
    • 退房ylim

    • 使用 .* 逐个元素进行乘法运算 .

  • 0

    Matlab中的 * 运算符是矩阵乘法器 . 因此,它仅在第一矩阵的第二维与第二矩阵的第一维相同时起作用(并且如果矩阵不是二维的话它根本不起作用) .

    .* 运算符基于"per element":所以在表达式 C=A.*B 中,你得到

    C(1,1) = A(1,1) * B(1,1);
    C(1,2) = A(1,2) * B(1,2);
    

    等等

    注 - 对于 .* ,矩阵必须具有相同的尺寸:A(N,M)和B(N,M) . 对于 * 操作,您必须具有A(M,N)和B(N,P) . 另请注意 - Matlab中的任何"vector"实际上都是1xN(行)或Nx1(列)矩阵......

    要回答你的问题“表达 n*log2(n) 的正确方法是什么” - 请使用 n.*log2(n);

    至于在不同尺度上绘制事物:您可以使用 semilogy 绘制对数Y刻度(如果Y值中有零则不使用)或在 plot 命令后使用 ylim([lower upper]) 作为单独的声明来获取范围内的输出 .

    如果你想要聪明并且在Y值中使用零时使用半月,你可以这样做:

    notZero = find(Y>0);
    semilogy(X(notZero),Y(notZero);
    

相关问题