如何将值列表更改为全部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?
答案 0 :(得分:1)
原始问题的代码 -
final(1:size(final,1)+1:end)=1
说明:例如,考虑5x5
最终矩阵,对角线元素的索引为(1,1)
,(2,2)
.. (5,5)
。将这些转换为线性索引 - 1
,7
等等,直到最后一个元素,这正是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
说明:这里我们使用要设置的元素的rows
和columns
索引创建线性索引。这里的rows
为 - 1:size(final,1)
,columns
为size(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]))