2013-02-22 17 views
5

Używam Matlab do wywoływania wywołania zewnętrznego w C++, a następnie otrzymuję z powrotem ogromną macierz obliczeniową. Macierz jest bardzo duża i nie mam dostępu do tego kodu źródłowego programu C++. (jeśli mam, zrobię to z C++ od razu)Najszybszy możliwy sposób zapisywania macierzy Matlab

W tej chwili, w moim systemie, ten program C++ używa tylko 1 sekundy do obliczenia danych i wysłania z powrotem do Matlab, a dlmwrite do Matlaba zajmuje 200- 300 sekund, aby zapisać tę pojedynczą ogromną tablicę na dysku. Mam kilka tysięcy do obliczenia, a ja chcę ograniczyć czas.

Jaki jest najszybszy sposób oszczędzania w programie Matlab?

+0

Co chcesz zrobić z zapisanymi danymi? Przeczytaj je w Excelu? Używaj ich tylko w MATLAB? –

+0

Przetworzone dane będą używane gdzie indziej dalej przez kilka innych programów. – Karl

+0

To niezbyt pomocne. Jaki format wejściowy możesz zaakceptować dla innych programów? –

Odpowiedz

5

Najszybszym możliwym sposobem jest prawdopodobnie polecenie Matlaba: save. Ewentualnie możesz całą macierz przekształcić w plik binarny.

Użycie dlmwrite konwertuje wartości na tekst, co zajmuje dużo czasu i jest więcej danych do zapisania na dysk. Nie rób tego, chyba że naprawdę potrzebujesz danych w tym formacie. Zauważ, że dlmwrite będzie szybszy, jeśli zostanie wywołany jeden raz z dużą macierzą zamiast w pętli, która inkrementalnie zapisuje twój plik.

+0

Przetestowałem "a = zera (10000); dlmwrite (...) zajmuje 89,5 sekundy, natomiast zapisywanie (...) trwa 2,68 sekundy. "To imponujące. – Karl

+0

Ale niestety, jeśli mam zamiar użyć plików mat z funkcji zapisywania, będę musiał zagłębić się w czytanie plików mat. – Karl

+0

Pliki .mar czytanie .Kar mogą być złożone w zależności od danych. 'fwrite' jest prawdopodobnie tak szybki jak' save', ale musisz zdecydować o własnym niestandardowym formacie binarnym i móc go napisać i przeczytać. – shoelzer

2

Jeśli chcesz rozwiązania opartego wyłącznie na Matlabie, prawdopodobnie użyłbym fwrite dla binarnego lub fprintf dla ASCII. Jednak lubię mieszać Matlab i Java, jeśli chodzi o IO, ponieważ zazwyczaj jest to szybsze. Chciałbym zrobić coś takiego

Java Code 
package mypackage.release; 

import java.io.DataOutputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException 


public class MatrixWriter { 
    public static void write(String fileName, double[] matrix) throws IOException { 
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName))); 
    for (double d : matrix) 
     dos.writeDouble(d); 
    dos.close(); 
    } 
} 

Matlab Code 
import mypackage.release.MatrixWriter; 
M = get matrix from c++; 
MatrixWriter.write('myfile.dat', M(:)); 

to jest coś, z góry na głowie, ale używam odmiany tego cały czas. Mam nadzieję, że to pomoże.

+0

Czy możesz pokazać wynik twojego kodu VS dlmwrite? – Karl

+1

pewnie. m = zera (1000); tic; dlmwrite ("temp.dat", m); toc; Upływający czas to 2,296942 sekund tic; MatrixWriter.write ("temp.dat", m (:)); toc Minął czas 0.252032 sekund – PaxRomana99

+0

fyi, po prostu porównać go do fwrite, a to jest w tym przypadku szybsze. Chyba, że ​​robisz coś bardziej złożonego, co może być najlepszym sposobem. – PaxRomana99

Powiązane problemy