2010-02-05 17 views
5

Qualcuno sa se esiste un modo per produrre un array 2D da un array 1D, in cui le righe nel 2D vengono generate ripetendo gli elementi corrispondenti nell'array 1D.Produzione di array 2D da un array 1D in MATLAB

cioè .:

1D array  2D array 

    |1|  |1 1 1 1 1| 
    |2|  |2 2 2 2 2| 
    |3| -> |3 3 3 3 3| 
    |4|  |4 4 4 4 4| 
    |5|  |5 5 5 5 5| 

risposta

8

È possibile farlo utilizzando la funzione REPMAT:

>> A = (1:5).' 

A = 

    1 
    2 
    3 
    4 
    5 

>> B = repmat(A,1,5) 

B = 

    1  1  1  1  1 
    2  2  2  2  2 
    3  3  3  3  3 
    4  4  4  4  4 
    5  5  5  5  5 

EDIT: BONUS RISPOSTA! ;)

Per il vostro esempio, REPMAT è la funzione più semplice da utilizzare. Tuttavia, un'altra funzione cool per essere consapevoli è KRON, che si potrebbe anche usare come soluzione nel modo seguente:

B = kron(A,ones(1,5)); 

Per i piccoli vettori e matrici KRON può essere leggermente più veloce, ma è piuttosto una un po 'più lento per matrici più grandi.

+0

Grande, grazie mille! – Richard

1

repmat (a, [1 n]), ma si dovrebbe anche dare un'occhiata a meshgrid.

0

Si potrebbe provare qualcosa di simile:

a = [1 2 3 4 5]' 
l = size(a) 
for i=2:5 
    a(1:5, i) = a(1:5) 

Il ciclo continua a aggiungendo colonne fino alla fine.

+1

Per le matrici piccole questa soluzione è più veloce, ma per le grandi dimensioni repmat è una soluzione molto migliore. (Con una matrice 1000x1000, repmat è 500+ volte più veloce!) – Doresoom

+0

Sono d'accordo, la mia soluzione è piuttosto ingenua, usando repmat è una soluzione molto migliore/più elegante in generale. – zdav

9

Nello spirito di risposte bonus, ecco alcune delle mie:

Let A = (1:5)'

  1. Utilizzando gli indici [più veloce di repmat]:

    B = A(:, ones(5,1)) 
    
  2. Utilizzando matrice esterna prodotto:

    B = A*ones(1,5) 
    
  3. Utilizzando bsxfun() [non il modo migliore di farlo]

    B = bsxfun(@plus, A, zeros(1,5)) 
    %# or 
    B = bsxfun(@times, A, ones(1,5)) 
    
+2

+1 per gli indici trucco – merv

+0

kron ((1: 5) ', quelli (1,5)) –

+1

cumsum (quelli (5)) –