MATLAB:限制绘制值的范围

时间:2013-02-16 23:51:47

标签: matlab

我根本不是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 :(得分:0)

  1. 查看ylim

  2. 使用.*进行逐元素乘法。

答案 1 :(得分:0)

Matlab中的*运算符是矩阵乘数。因此,只有当第一个矩阵的第二维与第二个矩阵的第一个维相同时,它才有效(如果矩阵不是二维的话,它根本不起作用)。

.*运算符基于“每个元素”工作:因此在表达式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中的任何“向量”实际上都是1xN(行)或Nx1(列)矩阵......

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

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

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

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