MATLAB:绘制值的极限范围

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); 

  1. 退房ylim

  2. 待办事项元素乘元素乘法.*

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);