2010-12-08 6 views

Répondre

0

Si vous avez une ancienne version de Matlab avant BSXFUN a été introduit, envisager cette option (la même réponse que celle par @Jonas):

N = 4; M = 3; 
A = repmat(eye(N),[1 1 M]) .* repmat(permute(1:M,[3 1 2]),[N N 1]) 

A(:,:,1) = 
    1  0  0  0 
    0  1  0  0 
    0  0  1  0 
    0  0  0  1 
A(:,:,2) = 
    2  0  0  0 
    0  2  0  0 
    0  0  2  0 
    0  0  0  2 
A(:,:,3) = 
    3  0  0  0 
    0  3  0  0 
    0  0  3  0 
    0  0  0  3 
1

Une façon de faire cela consiste à utiliser les fonctions KRON et RESHAPE:

>> N = 4; 
>> A = reshape(kron(1:3,eye(N)),[N N 3]) 

A(:,:,1) = 

    1  0  0  0 
    0  1  0  0 
    0  0  1  0 
    0  0  0  1 

A(:,:,2) = 

    2  0  0  0 
    0  2  0  0 
    0  0  2  0 
    0  0  0  2 

A(:,:,3) = 

    3  0  0  0 
    0  3  0  0 
    0  0  3  0 
    0  0  0  3 
1

Une autre option consiste à utiliser BSXFUN, la multiplication de la matrice d'identité avec un 1-en-1-en-3 matrice de 1,2,3

>> bsxfun(@times,eye(4),permute(1:3,[3,1,2])) 
ans(:,:,1) = 
    1  0  0  0 
    0  1  0  0 
    0  0  1  0 
    0  0  0  1 
ans(:,:,2) = 
    2  0  0  0 
    0  2  0  0 
    0  0  2  0 
    0  0  0  2 
ans(:,:,3) = 
    3  0  0  0 
    0  3  0  0 
    0  0  3  0 
    0  0  0  3 
+0

bsxfun n'est pas dans matlab7.3.0 (r2006b), correct? –

+0

@Quiang Li: On dirait qu'il est apparu en premier dans r2007a. – Jonas

Questions connexes