Bonjour à tous !


Je voudrais une fonction pour créer une matrice k-diagonale, avec les chiffres à mettre sur les diags en paramètre.

j'en ai déjà une qui fonctionne, mais c'est très moche

si vous savez comme faire ça entièrement matriciellement, je veux bien de votre aide

function out = kDiag(taille,diags)
% KDIAG - create a k-diagonal matrix
%
% Use :
% - out = kDiag(taille,diags)
%
% Example :
% >> kDiag(5,3)
% >> kDiag(5,[1,2,3])
% >> kDiag(5,[3,5,4,8,-1])

if length(diags)==1
diags = ones(diags,1);
end

nbdiag = length(diags);

% création d'une suite de taille nbdiag + 1
t = floor(nbdiag/2);
t = -t:t;

% première diagonale
M = eye(taille,taille)*diags(find(t==0));

% on efface de diags les infos sur la 1ère diag
diags(find(t==0))=[];

% on efface de la suite l'entrée = 0 pour ne pas planter diag plus bas.
t = t(t~=0);

% pour chaque diagonale demandée, on la calcule dans tmp et on la superpose à M
for i=1:nbdiag-1
tmp = diag(ones(taille,1),t(i))*diags(i);
M = M + tmp(1:end-abs(t(i)),1:end-abs(t(i)));
end

out = M;