2015-04-22 202 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,这在技术上是内置的,功能。