1 votes

Comment puis-je générer la matrice suivante dans MATLAB ?

Je veux générer une matrice qui est "stairsteppy" à partir d'un vecteur.

Exemple de vecteur d'entrée : [8 12 17]

Exemple de matrice de sortie :

[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]

Existe-t-il un moyen plus facile (ou intégré) de faire cela que le suivant ?

function M = stairstep(v)
M = zeros(length(v),max(v));
v2 = [0 v];
for i = 1:length(v)
   M(i,(v2(i)+1):v2(i+1)) = 1;
end

4voto

Loren Points 1182

Vous pouvez le faire via l'indexation.

A = eye(3);
B  = A(:,[zeros(1,8)+1, zeros(1,4)+2, zeros(1,5)+3])

3voto

catchmeifyoutry Points 4956

Voici une solution sans boucles explicites :

function M = stairstep(v)
L = length(v); % M will be
V = max(v);    %   an  L x V matrix

M = zeros(L, V);

% create indices to set to one
idx = zeros(1, V);
idx(v + 1) = 1;
idx = cumsum(idx) + 1;
idx = sub2ind(size(M), idx(1:V), 1:V);

% update the output matrix
M(idx) = 1;

EDITAR: bug corrigé :p

2voto

gnovice Points 70970

Il n'y a pas de fonction intégrée que je connaisse pour faire cela, mais voici une solution vectorisée :

v = [8 12 17];
N = numel(v);
M = zeros(N,max(v));
M([0 v(1:N-1)]*N+(1:N)) = 1;
M(v(1:N-1)*N+(1:N-1)) = -1;
M = cumsum(M,2);

EDITAR: J'aime l'idée que Jonas a dû utiliser BLKDIAG . Je n'ai pas pu m'empêcher de jouer un peu avec l'idée jusqu'à ce que je la raccourcisse encore plus (en utilisant MAT2CELL au lieu de ARRAYFUN ) :

C = mat2cell(ones(1,max(v)),1,diff([0 v]));
M = blkdiag(C{:});

1voto

John Points 12438

Vous pouvez utiliser ones pour définir les endroits où vous avez des 1 :

http://www.mathworks.com/help/techdoc/ref/ones.html

1voto

Jonas Points 54073

Une version très courte d'une solution vectorisée

function out = stairstep(v)

% create lists of ones
oneCell = arrayfun(@(x)ones(1,x),diff([0,v]),'UniformOutput',false);
% create output
out = blkdiag(oneCell{:});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X