5

dire che abbiamo la seguente matrice casuale:Matlab aggiunta di righe e colonne elegantemente

1 2 3 4 
5 6 7 8 
9 8 7 6 
5 4 3 2 

mi vuoi trasformarlo in quanto segue:

1 0 2 0 3 0 4 0 
0 0 0 0 0 0 0 0 
5 0 6 0 7 0 8 0 
0 0 0 0 0 0 0 0 
9 0 8 0 7 0 6 0 
0 0 0 0 0 0 0 0 
5 0 4 0 3 0 2 0 
0 0 0 0 0 0 0 0 

Per qualche motivo non posso usare mathjax formatta in modo che sembri un po 'orribile, mi dispiace per questo. Il punto è che voglio aggiungere righe e colonne di zeri tra le mie righe e colonne attuali in modo da aumentare le sue dimensioni 2x.

Mi è venuto in mente il seguente codice, ma funziona solo con matrici molto piccole se lo utilizzo su un'immagine grande che non può terminare a causa di problemi di limitazione della memoria.

clear all 

I=imread('image.png'); 
I=rgb2gray(I); 

B=zeros(2*size(I)); 

[x, y]=find(-inf<I<inf); 

xy=[x,y]; 
nxy=xy; 

%coord change 
nxy=2*xy-1; 

B(nxy(:,1),nxy(:,2))=I(xy(:,1),xy(:,2)); 

Mi aspettavo di essere veloce perché è completamente vettorizzato con funzioni di maltlab ma fallisce miseramente. C'è un altro modo elegante per farlo?

+0

Per vostra informazione, mathjax non funziona semplicemente perché overflow dello stack non supporta it :) E ' a volte mancano, ma un sacco di domande che potrebbero farne un uso pesante sono comunque fuori tema. (Il tuo non lo è.) –

risposta

3

Se dai un'occhiata ai tuoi vettori di indicizzazione, questo è qualcosa come I([1 1 2 2] ,[1 2 1 2] ); per una matrice 2x2 che significa che indichi ogni riga e colonna due volte. La soluzione giusta è B(1:2:end,1:2:end)=I; che indicizza ogni seconda riga e ogni seconda colonna.

+0

Era così. Saluti! – Jimodium

1

Questo può essere fatto anche via uno di linea, dire la vostra matrice originale si chiama A, quindi

kron(A,[1,0;0,0]) 
+0

Questa dovrebbe essere la soluzione preferita, almeno per gli array 2d. 'kron' fa esattamente ciò che è richiesto ed è molto più generalizzabile. – Derek

Problemi correlati