[Generico] Scrivere un tensore su file csv
ciao,
sto lavorando in matlab con i tensori ossia array di 3 dimensioni. Ho bisogno di salvare un tensore su un file csv ma non riesco a risolvere il problema.
Ho usato i vari comandi dlmwrite, save, csvwrite ma non funzionano immagino perchè questi lavorano solo su matrici.
qualcuno ha una soluzione da suggerirmi?
grazie
sto lavorando in matlab con i tensori ossia array di 3 dimensioni. Ho bisogno di salvare un tensore su un file csv ma non riesco a risolvere il problema.
Ho usato i vari comandi dlmwrite, save, csvwrite ma non funzionano immagino perchè questi lavorano solo su matrici.
qualcuno ha una soluzione da suggerirmi?
grazie
Risposte
Dato un tensore triplo, se fissi un indice ottieni un tensore doppio [che puoi rappresentare come matrice]. Se cicli sul primo indice e stampi le varie "matrici" in fila, nello stesso file, dovresti riuscirci. In generale credo che sia questa la via maestra.
ciao,
ho provato questa strada: prendendo una slice, per esempio x(:,:,1) dove x è il tensore, che dovrebbe essere una matrice e usando dlmwrite mi da errore perchè la considera ancora come tensore.
Ho contattato chi ha fatto il toolbox tensorlab e mi hanno proposto questa soluzione:
csvwrite('mytensor.csv',tens2mat(permute(mytensor,[1 3 2]),1:2));
su un tensore 3x3x3 funziona ma su un tensore più grande no. Inoltre a me servirebbe che nel fiel csv ogni slice sia separata da una riga vuota.
idee?
grazie.
ho provato questa strada: prendendo una slice, per esempio x(:,:,1) dove x è il tensore, che dovrebbe essere una matrice e usando dlmwrite mi da errore perchè la considera ancora come tensore.
Ho contattato chi ha fatto il toolbox tensorlab e mi hanno proposto questa soluzione:
csvwrite('mytensor.csv',tens2mat(permute(mytensor,[1 3 2]),1:2));
su un tensore 3x3x3 funziona ma su un tensore più grande no. Inoltre a me servirebbe che nel fiel csv ogni slice sia separata da una riga vuota.
idee?
grazie.
Ti conviene stampare manualmente con tre for annidati: soluzione artigianale, ma risolvi in breve.
sto provando questa soluzione che sembra seguire la tua strada:
for i=1:4
pip=tens2mat(permute(a(:,:,i),[1 3 2]),1:2)
csvwrite('mytensor.csv',pip);
end
purtroppo nel file csv ritrovo solo l'ultima slice, ciò significa che ha sovrascritto il file non continuando a riempirlo con ogni slice. Ho provato ad usare un fopen e fclose ma niente.
suggerimenti?
grazie
for i=1:4
pip=tens2mat(permute(a(:,:,i),[1 3 2]),1:2)
csvwrite('mytensor.csv',pip);
end
purtroppo nel file csv ritrovo solo l'ultima slice, ciò significa che ha sovrascritto il file non continuando a riempirlo con ogni slice. Ho provato ad usare un fopen e fclose ma niente.
suggerimenti?
grazie
sembra che questa soluzione che ho trovato funzioni:
a=zeros(3,3,4);
a(:,:,1)=[1,2,3;4,5,6;7,8,9];
a(:,:,2)=[10,11,12;13,14,15;16,17,18];
a(:,:,3)=[19,20,21;22,23,24;25,26,27];
a(:,:,4)=[28,29,30;31,32,33;34,35,36];
fid = fopen('mytensor.csv','w');
for k=1:4
el=a(:,:,k);
dlmwrite('mytensor.csv',el, '-append' )
dlmwrite('mytensor.csv', ' ' ,'-append' )
end
fclose(fid);
a=zeros(3,3,4);
a(:,:,1)=[1,2,3;4,5,6;7,8,9];
a(:,:,2)=[10,11,12;13,14,15;16,17,18];
a(:,:,3)=[19,20,21;22,23,24;25,26,27];
a(:,:,4)=[28,29,30;31,32,33;34,35,36];
fid = fopen('mytensor.csv','w');
for k=1:4
el=a(:,:,k);
dlmwrite('mytensor.csv',el, '-append' )
dlmwrite('mytensor.csv', ' ' ,'-append' )
end
fclose(fid);