2016-11-06 1 views
0

J'ai un vecteur qui a 1 dans certains endroits, et je veux créer une diagonale en utilisant le vecteur. Le vecteur est appelé one_vec_two:Pourquoi `spdiags` ne place-t-il pas un vecteur au bon endroit?

n = 4; 

one_vec_two = zeros(n*n, 1); 
one_vec_two(1,1) = 1; 
for k=0:(n-1) 
    one_vec_two(k*n+1, 1) = 1; 
end 

non_zero_vecs = [one_vec_two]; 
placement = [n-1]; 

A = spdiags(non_zero_vecs, placement, n*n, n*n); 
fullA = full(A); 
disp(A) 

Le premier élément du vecteur one_vec_two est un mélange 1:

>> one_vec_two(1) 

ans = 

    1 

Et, je mis le vecteur à partir de diagonale n-1, qui est 3. Mais, quand je vais à la colonne 4, je ne vois pas:

>> fullA(1,4) 

ans = 

    0 

Pourquoi ne pas mettre mon Matlab vecteur au bon endroit?

Répondre

1

Selon la doc pour spdiag,

Note In this syntax, if a column of B is longer than the diagonal it is replacing, and m >= n, spdiags takes elements of super-diagonals from the lower part of the column of B, and elements of sub-diagonals from the upper part of the column of B.

il met l' inférieure partie de votre vecteur dans l'emplacement spécifié. D'où le résultat est comme prévu.

On dirait que vous voulez quelque chose comme

A = spdiags(non_zero_vecs([end-placement+1:end 1:end-placement]), placement, n*n, n*n) 

ou

A = spdiags(non_zero_vecs, -placement, n*n, n*n)' 

tous deux font la même chose, juste de façon légèrement différente.

+0

Je vois ... merci – Sother