2013-02-22 43 views
5

Tôi đang sử dụng Matlab để gọi một số cuộc gọi bên ngoài trong C++ và sau đó nhận được ma trận được tính toán rất lớn. Ma trận là rất lớn, và tôi không có quyền truy cập vào mã nguồn của chương trình C++ này. (nếu có, tôi sẽ làm cho nó tiết kiệm ngay từ C++)Cách nhanh nhất có thể để lưu ma trận Matlab

Hiện tại, trên hệ thống của tôi, chương trình C++ này chỉ sử dụng 1 giây để tính toán dữ liệu đã cho và gửi lại Matlab, và dlmwrite của Matlab mất 200 300 giây để lưu mảng lớn duy nhất này trên đĩa. Tôi có thêm hàng nghìn để tính toán, và tôi muốn cắt giảm thời gian.

Vậy cách nhanh nhất có thể lưu trong Matlab là gì?

+0

Bạn muốn làm gì với dữ liệu đã lưu? Đọc chúng trong Excel? Chỉ sử dụng chúng trong MATLAB? –

+0

Dữ liệu được xử lý này sẽ được một số chương trình khác sử dụng ở nơi khác. – Karl

+0

Điều đó không thực sự hữu ích. Định dạng đầu vào nào bạn có thể làm cho các chương trình khác chấp nhận? –

Trả lời

5

Cách nhanh nhất có thể là lệnh save của Matlab. Ngoài ra, bạn có thể fwrite toàn bộ ma trận vào tệp nhị phân.

Sử dụng dlmwrite chuyển đổi giá trị thành văn bản, cần có thời gian và có nhiều dữ liệu hơn để ghi vào đĩa. Đừng làm điều đó trừ khi bạn thực sự cần phải có dữ liệu ở định dạng đó. Lưu ý rằng dlmwrite sẽ nhanh hơn nếu được gọi một lần với một ma trận lớn thay vì trong một vòng lặp từng bước ghi tệp của bạn.

+0

Tôi đã thử nghiệm 'a = số không (10000); dlmwrite (...) mất 89,5 giây trong khi lưu (...) mất 2,68 giây. Bây giờ, đó là ấn tượng. – Karl

+0

Nhưng thật không may, nếu tôi sẽ sử dụng tập tin mat từ chức năng tiết kiệm, tôi sẽ phải đào sâu vào các tập tin đọc. – Karl

+0

@Karl Đọc. Các tệp .mat có thể phức tạp tùy thuộc vào dữ liệu của bạn. 'fwrite' có thể nhanh như' save', nhưng sau đó bạn phải quyết định định dạng nhị phân tùy chỉnh của riêng bạn và có thể viết và đọc nó. – shoelzer

2

Nếu bạn muốn một giải pháp chỉ Matlab, tôi có lẽ sẽ sử dụng fwrite cho nhị phân hoặc fprintf cho ASCII. Tuy nhiên, tôi muốn kết hợp Matlab và Java khi nói đến IO vì điều này thường nhanh hơn. Tôi sẽ làm một cái gì đó như

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

Đây là một cái gì đó trên đầu của tôi, nhưng tôi sử dụng các biến thể này mọi lúc. Hy vọng nó giúp.

+0

Bạn có thể vui lòng hiển thị một số kết quả của mã của bạn VS dlmwrite ít nhất không? – Karl

+1

chắc chắn. m = 0 (1000); tic; dlmwrite ('temp.dat', m); toc; Thời gian đã trôi qua là 2,296942 giây tic; MatrixWriter.write ('temp.dat', m (:)); toc Thời gian đã trôi qua là 0,252032 giây – PaxRomana99

+0

fyi, chỉ cần so sánh với fwrite và nhanh hơn trong trường hợp này. Trừ khi bạn đang làm một cái gì đó phức tạp hơn có thể là cách tốt nhất để đi. – PaxRomana99

Các vấn đề liên quan