如何更改矩阵对角线列的值?

时间:2014-09-25 04:14:23

标签: matlab

如何将值列表更改为全部1?我需要从右下角到左下角也以1结束。

rc = input('Please enter a value for rc: ');
mat = ones(rc,rc);
for i = 1:rc
    for j = 1:rc
        mat(i,j) = (i-1)+(j-1);
    end
end
final = mat
final(diag(final)) = 1 % this won't work?

4 个答案:

答案 0 :(得分:1)

原始问题的代码 -

final(1:size(final,1)+1:end)=1

说明:例如,考虑5x5最终矩阵,对角线元素的索引为(1,1)(2,2) .. (5,5)。将这些转换为线性索引 - 17等等,直到最后一个元素,这正是1:size(final,1)+1:end给我们带来的。


修改:如果您想将对角线(从右上角到左下角的元素)设置为1,则可采用以下方法:

final(fliplr(eye(size(final)))==1)=1

说明:在这种情况下,我们也可以使用线性索引,但为了更加可读性和可能有点乐趣,我们可以使用正确的掩码使用逻辑索引,这是使用fliplr(eye(size(final)))==1创建的。

但是,如果你关心性能,你也可以在这里使用线性索引,就像这样 -

final(sub2ind(size(final),1:size(final,1),size(final,2):-1:1))=1

说明:这里我们使用要设置的元素的rowscolumns索引创建线性索引。这里的rows为 - 1:size(final,1)columnssize(final,2):-1:1。我们将这两个字段提供给sub2ind,以便为我们提供可用于索引final的线性索引,并将它们设置为1

如果你想在这里挤出最高性能,请使用sub2ind的原始版本 -

final([size(final,2)-1:-1:0]*size(final,1) + [1:size(final,1)])=1

答案 1 :(得分:1)

到目前为止,所有指定的方法都是执行您所要求的方法的好方法。

但是,我想提供另一种观点和我在您的代码中注意到的内容,以及此矩阵的一个有趣的属性,可能会或可能没有被注意到。矩阵中的所有反对角线值都等于rc - 1

因此,如果要将所有反对角线值设置为1,则可以作弊并简单地找到等于rc-1的值并将其设置为1。换句话说:

final(final == rc-1) = 1;

关于效率的次要说明

作为一种效率方法,您可以使用hankel命令在构造for时执行两个mat循环正在执行的操作:

mat = hankel(0:rc-1,rc-1:2*(rc-1))

hankel在这种情况下的工作原理是矩阵的第一行由0:rc-1的向量指定。之后,后面的每一行都会递增地向左移动值,并在右侧添加一个递增值1。这一直持续到你遇到第二个参数中看到的向量,此时我们就停止了。换句话说,如果我们这样做:

mat = hankel(0:3,3:6)

这就是我们得到的:

mat = 

 0     1     2     3
 1     2     3     4
 2     3     4     5
 3     4     5     6

因此,通过指定rc = 5,这是我用hankel获得的矩阵,它与您的代码生成的矩阵相同(在将反对角线设置为1之前):

mat =

     0     1     2     3     4
     1     2     3     4     5
     2     3     4     5     6
     3     4     5     6     7
     4     5     6     7     8

将所有内容捆绑在一起

使用hankel和我提到的作弊,我们可以用三行代码计算你所要求的内容 - 第一行代码要求矩阵的维度:

rc = input('Please enter a value for rc: ');
mat = hankel(0:rc-1, rc-1:2*(rc-1));
mat(mat == rc-1) = 1;

mat包含您的最终矩阵。因此,使用rc = 5,这是我得到的矩阵:

mat =

     0     1     2     3     1
     1     2     3     1     5
     2     3     1     5     6
     3     1     5     6     7
     1     5     6     7     8

答案 2 :(得分:0)

这是一种方法:

假设我们有a方阵:

a = ones(5, 5)*5

a =

     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5

你可以删除对角线,然后创建一个对角线列表来替换它:

a = a - fliplr(diag(diag(fliplr(a)))) + fliplr(diag(ones(length(a), 1)))

a =

 5     5     5     5     1
 5     5     5     1     5
 5     5     1     5     5
 5     1     5     5     5
 1     5     5     5     5

diag(ones(length(a), 1))可以是任何向量,即。 1->5

 a = a - fliplr(diag(diag(fliplr(a)))) + fliplr(diag(1:length(a)))

 a =    
     5     5     5     5     1
     5     5     5     2     5
     5     5     3     5     5
     5     4     5     5     5
     5     5     5     5     5

答案 3 :(得分:0)

这是一个简单的方法,我只需添加/减去适当的矩阵就可以得到正确的结果:

final=mat-diag(diag(mat-1))+fliplr(diag([2-rc zeros(1,rc-2) 2-rc]))