2013-02-22 2 views
5

Я использую Matlab для вызова внешнего вызова на C++, а затем получаю огромную вычисленную матрицу обратно. Матрица очень большая, и у меня нет доступа к этому исходному коду программы на C++. (если у меня есть, я сделаю это для сохранения с C++ сразу)Самый быстрый способ сохранить матрицы Matlab

В настоящее время в моей системе эта программа на C++ использует только 1 секунду для вычисления данных и отправки обратно в Matlab, а dlmwrite от Matlab занимает 200- 300 секунд, чтобы сохранить этот единственный массив на диске. У меня есть еще несколько тысяч, чтобы вычислить, и я хочу сократить время.

Так какой же самый быстрый способ сохранить в Matlab?

+0

Что вы хотите делать с сохраненными данными? Прочтите их в Excel? Использовать их только в MATLAB? –

+0

Эти обработанные данные будут использоваться в других местах несколькими другими программами. – Karl

+0

Это не очень полезно. В каком формате ввода вы можете принять другие программы? –

ответ

5

Самый быстрый способ, возможно, - это команда Матаба save. Альтернативно, вы можете fwrite всю матрицу в двоичный файл.

Использование dlmwrite преобразует значения в текст, что требует времени и больше данных для записи на диск. Не делайте этого, если вам действительно не нужны данные в этом формате. Обратите внимание, что dlmwrite будет быстрее, если вы вызовете одно время с большой матрицей, а не в цикле, который постепенно записывает ваш файл.

+0

Я тестировал 'a = нули (10000); dlmwrite (...) занимает 89,5 с, а save (...) занимает 2,68 сек. Теперь это впечатляет. – Karl

+0

Но, к сожалению, если я собираюсь использовать файлы-маты из функции сохранения, мне придется копать в чтение файлов матов. – Karl

+0

@ Karl Чтение .mat файлов может быть сложным в зависимости от ваших данных. 'fwrite', вероятно, так же быстро, как' save', но тогда вы должны решить свой собственный бинарный формат и сможете писать и читать его. – shoelzer

2

Если вы хотите только решение Matlab, я бы, вероятно, использовал fwrite для двоичного кода или fprintf для ASCII. Тем не менее, мне нравится смешивать Matlab и Java, когда речь заходит об IO, поскольку это обычно быстрее. Я бы сделал что-то вроде

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(:)); 

Это что-то не в моей голове, но я все время использую вариации этого. Надеюсь, поможет.

+0

Не могли бы вы показать хотя бы какой-то результат своего кода VS dlmwrite? – Karl

+1

уверен. m = нули (1000); tic; dlmwrite ('temp.dat', m); TOC; Истекшее время составляет 2.296942 секунды tic; MatrixWriter.write ('temp.dat', m (:)); toc Истекшее время равно 0,252032 секунды – PaxRomana99

+0

fyi, просто сравнили его с fwrite, и в этом случае он быстрее. Если вы не делаете что-то более сложное, что может быть лучшим способом. – PaxRomana99