how to full fill the diagonal of a matrix by a vector

12 vues (au cours des 30 derniers jours)
Kamel
Kamel le 8 Mai 2019
Réponse apportée : Matt J le 10 Mai 2019
hello
how can i full fill a matrix (17*9) by a vector by length 9
for example i have the vector d=[1 2 3 ] and the matrix zeros(5*5) and i want to make the output matrix like this
1 0 0 3 2
2 1 0 0 3
3 2 1 0 0
0 3 2 1 0
0 0 3 2 1
thanks

Réponse acceptée

Adam Danz
Adam Danz le 8 Mai 2019
This approach uses circshift() to circularly shift the columns of matrix.
m = zeros(5,5);
v = [1,2,3];
% Loop through each column of m
for i = 1:size(m,2)
m(1:length(v),i) = v;
m(:,i) = circshift(m(:,1), i-1);
end
Result:
m =
1 0 0 3 2
2 1 0 0 3
3 2 1 0 0
0 3 2 1 0
0 0 3 2 1
  2 commentaires
Kamel
Kamel le 8 Mai 2019
thank you very much
Adam Danz
Adam Danz le 10 Mai 2019
Glad I could help!

Connectez-vous pour commenter.

Plus de réponses (3)

Geoff Hayes
Geoff Hayes le 8 Mai 2019
Ahmed - try using
a = [1 2 3 0 0]';
A = cell2mat(arrayfun(@(x)circshift(a,x-1),1:length(a), 'UniformOutput', false));
We use arrayfun and circshift to apply an anonymous function that shifts the a down by one element (less one) for each of the five columns in your output matrix. We use cell2mat to conver the cell array output to a matrix.
  2 commentaires
Adam Danz
Adam Danz le 8 Mai 2019
Nice! Simultaneous solutions with the same approach!
Kamel
Kamel le 8 Mai 2019
Modifié(e) : Kamel le 8 Mai 2019
ok, thank you

Connectez-vous pour commenter.


Jan
Jan le 10 Mai 2019
Modifié(e) : Jan le 10 Mai 2019
m = zeros(5,5);
v = [1,2,3,4];
n = numel(v);
index = 1:n;
for i = 1:size(m,2)
m(mod(i-1:i+n-2, 5)+1, i) = v;
end

Matt J
Matt J le 10 Mai 2019
>> full(interpMatrix([1,2,3],1,5,1,'circ'))
ans =
1 0 0 3 2
2 1 0 0 3
3 2 1 0 0
0 3 2 1 0
0 0 3 2 1

Catégories

En savoir plus sur Operating on Diagonal Matrices dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by