如何在对角线上指定值?

Jas*_*n S 42 matlab vectorization

假设我有一个NxN矩阵A,一个由数字1:N的子集和一个值K组成的索引向量V,我想这样做:

 for i = V
     A(i,i) = K
 end
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个带矢量化的声明中做到这一点?

例如A(某事)= 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
Run Code Online (Sandbox Code Playgroud)

Jon*_*nas 61

我通常使用EYE:

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
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建线性索引列表,因为从一个对角元素到下一个对角元素,它需要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
Run Code Online (Sandbox Code Playgroud)

如果您只想访问对角线元素的子集,则需要创建对角线索引列表:

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
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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
Run Code Online (Sandbox Code Playgroud)


ysa*_*sap 23

>> tt = zeros(5,5)
tt =
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
>> tt(1:6:end) = 3
tt =
     3     0     0     0     0
     0     3     0     0     0
     0     0     3     0     0
     0     0     0     3     0
     0     0     0     0     3
Run Code Online (Sandbox Code Playgroud)

更一般的:

>> V=[1 2 5]; N=5;
>> tt = zeros(N,N);
>> tt((N+1)*(V-1)+1) = 3
tt =
     3     0     0     0     0
     0     3     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     3
Run Code Online (Sandbox Code Playgroud)

这是基于以下事实:矩阵可以作为一维阵列(向量)访问,其中2个索引(m,n)由线性映射m*N + n代替.