2015-07-28 71 views
-11

編寫一個名爲identity的函數,該函數創建一個正方形單位矩陣,該矩陣的元素爲0,但對角線上的元素(從左上角到右下角)的值爲1。對角線由行列索引相同的元素組成:(1,1),(2,2)等。創建一個正方形標識矩陣

函數帶有一個正整數輸入參數,它是矩陣的大小,並返回矩陣本身作爲輸出參數。

例如,identity(4)必須返回一個4×4的單位矩陣。

您不允許使用內置的eyediag功能。

(提示:你可以索引到一個單一的指標和MATLAB將處理它,彷彿它是用列主順序的載體基質。)

+6

這是很容易實現和聽起來像功課。你的研究工作在哪裏?請閱讀[如何問](http://stackoverflow.com/help/how-to-ask)並編輯您的問題。展示你迄今爲止所嘗試的以及你的想法是如何解決這個問題的。 – Matt

+0

或者你可以這樣做'修復(corrcoef(rand(10,10)))':)這不是一個好方法,但它會做你需要的。 – patrik

回答

0

假設你可以使用內置的功能zeros() ,一可能實施方案eye() funtion的是以下之一:

function matrix = identity(n) 
    out = zeros(n); 
    idx = 1:n+1:n^2; 
    out(idx) = 1; 
    matrix = out; 
end 
2

讓我們做兩個簡單的線條和沒有zeros ...第一行創建一個n x n矩陣,其中所有元素都0。之後,你可以(如你的提示所述)用單一參數來處理元素。身份矩陣中的距離爲n+1。這樣你就可以用提到的距離寫出直到最後的距離。

function out = identity(n) 
    out(n,n)  = 0; 
    out(1:n+1:end) = 1; 
end 
+0

您是否知道,如果「A(n,n)= 0」和「A =零(n)」之間存在性能差異? – k1next

+0

哇哦,我只是測試這一點,併爲'N = 10000',你的方法需要0.000255秒,而'零(N)'需要1.106566秒。我一直認爲,標準的方法是使用'零(N)'。 – k1next

+0

@sonystarmap檢查出無證Matlab的[這](http://undocumentedmatlab.com/blog/preallocation-performance)的文章。不要錯過«預先分配的變化»部分。 – Matt

1

你可以從基礎開始:

function M = identity(n) 
    M = zeros(n); 
    for i=1:n 
     M(i,i) = 1; 
    end 
end 

幾乎相同的代碼,任何其他語言...