我根本不是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 回答
退房ylim
使用
.*
逐个元素进行乘法运算 .Matlab中的
*
运算符是矩阵乘法器 . 因此,它仅在第一矩阵的第二维与第二矩阵的第一维相同时起作用(并且如果矩阵不是二维的话它根本不起作用) ..*
运算符基于"per element":所以在表达式C=A.*B
中,你得到等等
注 - 对于
.*
,矩阵必须具有相同的尺寸: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值中使用零时使用半月,你可以这样做: