0

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

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

我的代码在这篇文章的末尾。

问题 1:虽然我已经指定了 n 的值范围和我想要的轴限制,但显然 n-squared 和 n-factorial 的值将大大超出所需的 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);
4

2 回答 2

0
  1. 看看ylim

  2. 用 进行逐个元素的乘法.*

于 2013-02-17T00:02:37.060 回答
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);
于 2013-02-17T00:37:06.293 回答