如何分配对angular线上的值?

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

for i = V A(i,i) = K end 

有没有办法做到这一点在一个声明瓦特/vector化?

例如A( 某物 )= K

声明A(V,V) = K将不起作用,它分配非对angular元素,这不是我想要的。 例如:

 >> 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 

我通常使用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 

或者,您可以创build线性索引列表,因为从一个对angular元素到下一个元素需要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 

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

 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创build一个逻辑索引数组(仅适用于方阵)

 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 
 >> 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 

和更一般的:

 >> 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 

这是基于matrix可以作为一维数组(vector)被访问的事实,其中2个索引(m,n)被线性映射m * N + n所取代。

 A = zeros(7,6); V = [1 3 5]; [nm] = size(A); diagIdx = 1:n+1:n*m; A( diagIdx(V) ) = 1 A = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 

假设K是值。 命令

 A=A-diag(K-diag(A)) 

可能会快一点

 >> A=randn(10000,10000); >> tic;A(logical(eye(size(A))))=12;toc 

已用时间为0.517575秒。

 >> tic;A=A+diag((99-diag(A)));toc 

经过时间是0.353408秒。

但它消耗更多的内存。

我会使用sub2ind并通过对angular线索引作为x和y参数:

 A = zeros(4) V=[2 4] idx = sub2ind(size(A), V,V) % idx = [6, 16] A(idx) = 1 % A = % 0 0 0 0 % 0 1 0 0 % 0 0 0 0 % 0 0 0 1