MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   如何在对角线上分配值? (https://www.labfans.com/bbs/showthread.php?t=24019)

poster 2019-12-10 20:48

如何在对角线上分配值?
 
假设我有一个NxN矩阵A,一个由数字1:N的子集组成的索引向量V和一个值K,我想这样做:

for i = V A(i,i) = K end 有没有一种方法可以在带有向量化的语句中做到这一点?

例如A( [B]某物[/B] )= K

语句A(V,V) = K将不起作用,它分配了非对角线元素,这不是我想要的。例如:

>> A = zeros(5); >> V = [1 3 4]; >> A(V,V) = 1 A = 1 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0

[B]回答:[/B]

我通常为此使用[URL="http://www.mathworks.com/help/techdoc/ref/eye.html"]EYE[/URL] :

A = magic(4) A(logical(eye(size(A)))) = 99 A = 99 2 3 13 5 99 10 8 9 7 99 12 4 14 15 99 另外,您也可以只创建线性索引列表,因为从一个对角线元素到下一个对角元素,需要nRows+1步:

[nRows,nCols] = size(A); A(1:(nRows+1):nRows*nCols) = 101 A = 101 2 3 13 5 101 10 8 9 7 101 12 4 14 15 101 如果只想访问对角线元素的子集,则需要创建对角线索引的列表:

subsetIdx = [1 3]; diagonalIdx = (subsetIdx-1) * (nRows + 1) + 1; A(diagonalIdx) = 203 A = 203 2 3 13 5 101 10 8 9 7 203 12 4 14 15 101 或者,您可以使用diag创建逻辑索引数组(仅适用于正方形数组)

diagonalIdx = false(nRows,1); diagonalIdx(subsetIdx) = true; A(diag(diagonalIdx)) = -1 A = -1 2 3 13 5 101 10 8 9 7 -1 12 4 14 15 101

[url=https://stackoverflow.com/questions/3963565]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:27

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.