Pagina 1 di 1

Creazione di una matrice 3D (Matlab)

MessaggioInviato: 25 lug 2019, 21:44
da Ianero
Ho 3 vettori di lunghezze diverse:

\underline{\theta}=\begin{bmatrix}
\theta_1\\ 
\theta_2\\... 
\\ \theta_l

\end{bmatrix}

\underline{v}=\begin{bmatrix}
v_1\\ 
v_2\\... 
\\ v_m

\end{bmatrix}

\underline{k}=\begin{bmatrix}
k_1\\ 
k_2\\... 
\\ k_n

\end{bmatrix}

e vorrei costruire tre distinte matrici, tutte della stessa dimensione mxnxl (3D), fatte così (per ogni posizione, riporto 3 elementi, uno per ogni matrice che voglio ottenere):

primo strato
\begin{bmatrix}
\theta_1/v_1/k_1 & \theta_1/v_1/k_2 & ... & \theta_1/v_1/k_n \\
\theta_1/v_2/k_1 & \theta_1/v_2/k_2 & ... & \theta_1/v_2/k_n \\
&...&\\
\theta_1/v_m/k_1 & \theta_1/v_m/k_2 & ... & \theta_1/v_m/k_n
\end{bmatrix}

secondo strato
\begin{bmatrix}
\theta_2/v_1/k_1 & \theta_2/v_1/k_2 & ... & \theta_2/v_1/k_n \\
\theta_2/v_2/k_1 & \theta_2/v_2/k_2 & ... & \theta_2/v_2/k_n \\
&...&\\
\theta_2/v_m/k_1 & \theta_2/v_m/k_2 & ... & \theta_2/v_m/k_n
\end{bmatrix}

...

ultimo strato
\begin{bmatrix}
\theta_l/v_1/k_1 & \theta_l/v_1/k_2 & ... & \theta_l/v_1/k_n \\
\theta_l/v_2/k_1 & \theta_l/v_2/k_2 & ... & \theta_l/v_2/k_n \\
&...&\\
\theta_l/v_m/k_1 & \theta_l/v_m/k_2 & ... & \theta_l/v_m/k_n
\end{bmatrix}

Vorrei ovviamente evitare di crearla con cicli for o cose simili, che in Matlab sono quasi sempre di troppo.

Esiste qualche scorciatoia che me lo fa fare in un paio di righe?

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 26 lug 2019, 23:11
da RLC
Ciao
Sei sicuro che le componenti delle varie matrici siano giuste? perché trovare delle correlazioni/serie dei pedici (trovarle servirà per automatizzare il codice) sembra un po' un rompicapo in stile "test QI" :D

Tuttavia, comincerei guardando qui:
https://it.mathworks.com/help/matlab/math/multidimensional-arrays.html

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 26 lug 2019, 23:57
da Ianero
Non è che esista un giusto.
A me servono così, chiedevo se ci fosse un modo standard di farlo con le potenzialità di Matlab o se in effetti bisogna ricorrere al for.

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 10:37
da MarkyMark
Il comando repmat è utile in questo caso

Codice: Seleziona tutto
theta = (1:2)';
v = (3:5)';
k = (6:9)';
l = length(theta);
m = length(v);
n = length(k);

A1(1:m,1:n,1:l) = theta(1);
A1(:,1,:) = repmat(theta',m,1);

A2(1:m,1:n) = repmat(v,1,n);
A2(:,:,1:l) = repmat(A2,1,1,l);

A3(1:m,1:n) = repmat(k',m,1);
A3(:,:,1:l) = repmat(A3,1,1,l);


Spero di aver interpretato correttamente la tua richiesta.

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 10:59
da Ianero
MarkyMark ha scritto:A1(:,1,:) = repmat(theta',m,1);

Questa mi mancava, grande.
Non sapevo che Matlab capisse da solo di dover distribuire le colonne.
Ottimo, grazie mille. :-)

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 11:19
da Ianero
No però aspetta c'è un problema con A1, le altre due vanno bene.
La matrice è corretta solo nella prima colonna di ogni strato. Ora bisognerebbe dirgli di replicare la matrice A1(:,1,:) lungo la seconda dimensione per n volte.

Dovrebbe andare così:

Codice: Seleziona tutto
A1(1:m,1,1:l) = repmat(theta',m,1);
A1(:,1:n,:)=repmat(A1,1,n,1);


Concordi?

EDIT: avevo indicato male in [1] la richiesta sulla matrice dei vari \theta, colpa mia, ho corretto adesso.

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 11:32
da MarkyMark
Sì, hai ragione. Ho sbagliato a leggere il primo post #-o



Come hai detto, si può costruire prima uno degli strati mxl e poi lo si replica n volte :ok:

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 11:44
da Ianero
Grazie Foto UtenteMarkyMark :D

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 12:10
da Ianero
Ho appena scoperto che si può fare tutto in una sola riga:

Codice: Seleziona tutto
theta = (1:2)';
v = (3:5)';
k = (6:9)';

[A1,A2,A3] = ndgrid(v,k,theta);


Quant'è potente questo linguaggio.

Re: Creazione di una matrice 3D (Matlab)

MessaggioInviato: 27 lug 2019, 12:17
da MarkyMark
Fantastico! Grazie :D