2010-12-29 50 views
9

Tôi cần ghi dữ liệu vào tệp .txt trong MATLAB. Tôi biết cách viết các chuỗi (fprintf) hoặc ma trận (dlmwrite), nhưng tôi cần một thứ có thể làm cả hai. Tôi sẽ đưa ra một ví dụ bên dưới:Làm cách nào để tôi có thể viết chuỗi và ma trận vào tệp .txt trong MATLAB?

str = 'This is the matrix: ' ; 
mat1 = [23 46 ; 56 67] ; 
%fName 
if *fid is valid* 
    fprintf(fid, '%s\n', str) 
    fclose(fid) 
end 
dlmwrite(fName, *emptymatrix*, '-append', 'delimiter', '\t', 'newline','pc') 
dlmwrite(fName, mat1, '-append', 'newline', 'pc') 

Điều này không sao, nhưng có vấn đề. Dòng đầu tiên của tệp là:

This is the matrix: 23,46 

Đó không phải là điều tôi muốn. Tôi muốn xem:

This is the matrix: 
23 46 
56 67 

Tôi làm cách nào để giải quyết vấn đề này? Tôi không thể sử dụng vòng lặp for và giải pháp printf vì dữ liệu rất lớn và thời gian là một vấn đề.

Trả lời

24

Tôi nghĩ rằng tất cả các bạn phải làm gì để khắc phục vấn đề của bạn là thêm một trở về vận chuyển (\r) để tuyên bố FPRINTF của bạn và loại bỏ các cuộc gọi đầu tiên để DLMWRITE:

str = 'This is the matrix: ';  %# A string 
mat1 = [23 46; 56 67];    %# A 2-by-2 matrix 
fName = 'str_and_mat.txt';   %# A file name 
fid = fopen(fName,'w');   %# Open the file 
if fid ~= -1 
    fprintf(fid,'%s\r\n',str);  %# Print the string 
    fclose(fid);      %# Close the file 
end 
dlmwrite(fName,mat1,'-append',... %# Print the matrix 
     'delimiter','\t',... 
     'newline','pc'); 

Và đầu ra trong các tập tin trông giống như này (với các tab giữa các con số):

This is the matrix: 
23 46 
56 67 


LƯU Ý: Một lời giải thích ngắn ... các rea con trai cần số \r trong câu lệnh FPRINTF là do trình kết thúc dòng PC bao gồm một dấu xuống dòng, theo sau là nguồn cấp dữ liệu dòng, được sử dụng bởi DLMWRITE khi tùy chọn 'newline','pc' được chỉ định. Cần có \r để đảm bảo dòng đầu tiên của ma trận xuất hiện trên một dòng mới khi mở tệp văn bản đầu ra trong Notepad.

+0

Cảm ơn gnovice! u đã giúp tôi một lần nữa! – Maddy

+0

Tôi có một số liên quan Q: Mã hoạt động chính xác trên hệ thống của tôi. Nhưng khi tôi từ xa máy tính để bàn đến một máy chủ và thiết lập đường dẫn Matlab của nó vào thư mục matlab địa phương của tôi, cùng một mã không thành lập tập tin. Toàn bộ các dự án chạy đúng, nhưng thủ tục tập tin bị lỗi. Có ý kiến ​​gì không? Cảm ơn – Maddy

+0

@Maddy: Làm thế nào là nó không? lỗi gì bạn nhận được? – gnovice

2

Bạn có hai cuộc gọi dlmwrite(), lần đầu tiên trên một ma trận trống và ma trận thứ hai thiếu tùy chọn 'dấu phân cách'. Điều gì sẽ xảy ra nếu bạn thêm nó vào cuộc gọi thứ hai?

5

Bạn không cần cuộc gọi ma trận trống. Hãy thử mã này:

str = 'This is the matrix: ' ; 
mat1 = [23 46 ; 56 67] ; 
fName = 'output.txt'; 
fid = fopen('output.txt','w'); 
if fid>=0 
    fprintf(fid, '%s\n', str) 
    fclose(fid) 
end 
dlmwrite(fName, mat1, '-append', 'newline', 'pc', 'delimiter','\t'); 
1

Tôi gặp phải tình huống tương tự khi thêm tiêu đề vào csv. Bạn có thể sử dụng dlmwrite với -append để thêm một dòng bằng cách đặt dấu phân cách của bạn bằng '' như được hiển thị bên dưới.

str = 'This is the matrix: ';  %# A string 
mat1 = [23 46; 56 67];    %# A 2-by-2 matrix 
fName = 'str_and_mat.txt';   %# A file name 
header1 = 'A, B' 
dlmwrite(fName, str, 'delimiter', '') 
dlmwrite(fName, header1, '-append', 'delimiter', '') 
dlmwrite(fName, mat1, '-append','delimiter', ',') 

này tạo ra như sau:

This is the matrix: 
A, B 
23,46 
56,67 
Các vấn đề liên quan