0

私はMatlabのユーザーではありませんが、手動で描画するのを避けるために、相対的なO表記の複雑さを説明するために、すばやく汚い2Dプロットを作成しようとしているだけです。Matlab バージョン R2010b を使用していますが、追加のツールキットはありません。私の質問は 2 つの部分で構成されています。同じプロットで次のケースのプロットを希望します。

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-squared を計算しようとしたときに同じエラーが発生しましたが、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

Matlabの*演算子は行列乗算器です。したがって、最初の行列の 2 番目の次元が 2 番目の行列の最初の次元と同じ場合にのみ機能します (行列が 2 次元でない場合はまったく機能しません)。

演算子は.*「要素ごと」に機能します。したがって、式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でのプロットについては、 which plots を対数 Y スケール (Y 値にゼロがある場合は使用しない) で使用するか、コマンドylim([lower upper])の後に別のステートメントとして使用して、範囲内の出力を取得できます。plot

Y 値が 0 の場合に賢くセミロジーを使用する場合は、次のようにすることができます。

notZero = find(Y>0);
semilogy(X(notZero),Y(notZero);
于 2013-02-17T00:37:06.293 に答える
0
  1. イリムをチェック

  2. で要素ごとの乗算を行い.*ます。

于 2013-02-17T00:02:37.060 に答える