2013-02-16 131 views
0

我不是一個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); 

回答

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實際上是一個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);