MATLAB:绘制值的极限范围
我不是一个Matlab用户,但我现在只是试图使用它创建一个快速和脏的二维图来说明相对的O-notation复杂性,以避免手工绘制它。我使用的是Matlab版本R2010b,我没有附加的工具包。我的问题由两部分组成。我想在同一个图上绘制下列情况的地块:MATLAB:绘制值的极限范围
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-squared时,我得到了同样的错误,但我可以通过将其更改为n^^来解决该问题。表达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);
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实际上是一个1×N个(行)或NX1(列)矩阵...
要回答你的问题“什么是表达n*log2(n)
有道” - 用n.*log2(n);
至于绘制不同比例的东西:您可以使用semilogy
,它以对数Y比例绘制(如果Y值为零,则不使用),或者在plot
命令后面使用ylim([lower upper])
作为独立语句以获取范围内的输出。
如果你要聪明一点,并使用semilogy当您在Y值为零,你可以做这样的事情:
notZero = find(Y>0);
semilogy(X(notZero),Y(notZero);