2015-04-22 140 views
3

我必須在Matlab中創建一個給定參數N的函數,它將返回N乘N單位矩陣。我不能使用循環,也不能使用內置函數,如eyediag。我曾嘗試以下:Matlab中的恆等矩陣

function I = identity(n) 
    I = zeros(n,n); 
    p = [1:n;1:n]'; 
    I(p) = 1; 
end 

但是,當我與I = identity(3);我得到以下結果稱之爲:

I = 

1  0  0 
1  0  0 
1  0  0 

而且我不明白爲什麼,因爲我覺得Matlab的可以使用矢量作爲矩陣索引,我所採取的方式,我有:

p = 

1  1 
2  2 
3  3 

所以,當我做I(p) = 1,第一步應該是I(1,1) = 1然後I(2,2) = 1等。我沒有看到什麼?

回答

4

使用沒有的功能,只是matrix indexing -

A(N,N) = 0; 
A((N+1)*(0:N-1)+1) = 1 

因此,功能變得 -

function A = identity(N) 
A(N,N) = 0; 
A((N+1)*(0:N-1)+1) = 1; 
end 
+0

我看到我們有一個類似的想法:) +1 –

+0

@ Benoit_11是的,這就是它的結局! – Divakar

3

在MATLAB索引是列優先的方式,因此它填充矩陣I與線性指數包含在p中,從(1,1)開始,然後到(2,1)等等。因此它「看到」指數爲[1 2 3],然後又是[1 2 3]。

你可以做的是將p變成包含適當線性索引的1xn向量。

例如:

p = 1:n+1:n^2 

產生了那些索引:

p = 

    1  5  9 

和下面的基質I

I = 

    1  0  0 
    0  1  0 
    0  0  1 

耶!

+0

我沒有得到'n *(n + 1)'部分。顯然,最後一個元素總是「n^2」。 'n^2'不夠嗎?然而+1 :) –

+1

哈哈是的,你確實是對的。我會編輯答案謝謝:) –

3

是否允許bsxfun

function I = identity(n) 

I = bsxfun(@eq,1:n,(1:n).'); 

end 
+0

不,不允許內置功能,但謝謝你的時間! –

0

與thewaywewalk的答案去,我們就可以實現與bsxfun方法,但不使用任何內置函數...除了ones同樣的事情。具體而言,我們可以使用索引來複制向量的行和列,然後在完成時使用相等運算符。具體來說,我們首先會從1:n生成一個行向量和列向量,複製它們以使它們分別爲n x n矩陣,然後使用相等。這個矩陣中的值只能沿着對角元素相等,因此產生了身份。

這樣:

row = 1:n; 
col = row.'; 
row = row(ones(n,1),:); 
col = col(:, ones(n,1)); 
I = (row == col) + 0; 

我們需要添加0到輸出矩陣的矩陣轉換爲double精度row == col會產生logical矩陣。我沒有使用double函數,因爲你說你不能使用任何內置函數......但我冒昧地使用了ones,因爲在你的解決方案中,你使用的是zeros,這在技術上是內置的,功能。