Je pense que j'ai trouvé une solution assez propre pour mon problème, donc je vais le publier comme une réponse moi-même. Il existe un framework Java open source simple pour l'exportation de fichier .mat appelé JMatIO (également disponible sur SourceForge, mais ici, assurez-vous de télécharger la version la plus récente 0.2). Il permet d'exporter facilement des données au format .mat qui est ensuite directement accessible à Matlab. Si vous avez des problèmes pour l'utiliser, en raison de peu de documentation, téléchargez la source ici:
svn co https://jmatio.svn.sourceforge.net/svnroot/jmatio jmatio
et jeter un oeil à des tests unitaires, ils montrent comment il peut être utilisé.
Retour à mon problème: J'avais besoin de télécharger une rafale d'images vers Matlab. Une image dans Matlab est une matrice 2D, donc une explosion d'entre eux serait une matrice 3D. Je n'ai pas compris comment exporter des baies Java en tant que matrices 3D dans Matlab, donc j'ai exporté chaque java.awt.image.BufferedImage
en tant que ligne dans Matlab, ce qui est facile à faire. Il faut une manipulation de données triviales dans Matlab pour représenter les données comme on le voudrait après (fonction de transposition matricielle et de remodelage). Jetez un oeil à l'extrait de code ci-dessous. L'exportation de la fonction mettra en mémoire tampon 100 images et si elle est appelée à nouveau, elle les exportera dans un fichier avec une profondeur de couleur de 8 bits.
public class MatFileExporter {
private BufferedImage frame;
private int[][] frames;
private int frameSize;
private int numFrames = 100;
private int frameNumber = 0;
protected void export() {
//This will only work with 8-bit coded SampleModels, change if needed
if (frames == null) {
frameSize = frame.getData().getWidth() * frame.getHeight();
frames = new int[numFrames][frameSize];
}
if (frameNumber < numFrames) {
frame.getData().getPixels(0, 0, frame.getWidth(),
frame.getHeight(), frames[frameNumber++]);
} else {
byte[][] framesByte = new byte[numFrames][frameSize];
for (int i=0; i<numFrames; i++) {
for (int j=0; j<frameSize; j++) {
framesByte[i][j] = (byte) frames[i][j];
}
}
MLUInt8 array = new MLUInt8("frames", framesByte);
ArrayList<MLArray> list = new ArrayList<MLArray>();
list.add(array);
new MatFileWriter("frames.mat", list);
}
}
}
N'hésitez pas à l'utiliser et à le changer, espérons que cela aidera quelqu'un. L'écriture incrémentielle de fichiers .mat est également supportée, consultez le code source pour cela.
Merci pour votre réponse adnrewmu. Je vais sûrement garder à l'esprit l'indice lié au tas. – mmm