2012-01-05 25 views
6

Vì vậy, tôi đã tạo ra một tập tin nhị phân với fortran, sử dụng một cái gì đó tương tự như sau:Nhìn vào kết quả nhị phân từ fortran trên gnuplot

open (3,file=filename,form="unformatted",access="sequential") 
write(3) matrix(i,:) 

Con đường tôi hiểu nó, miếng đệm fortran file với 4 byte trên hai đầu của tệp và phần còn lại chỉ là dữ liệu mà tôi muốn (trong trường hợp này là danh sách 1000 đôi).

Tôi muốn đọc điều này với gnuplot, tuy nhiên, tôi không biết cách lấy gnuplot để bỏ qua 4 byte đầu tiên và cuối cùng, và đọc phần còn lại ở dạng tăng gấp đôi. Các tài liệu hướng dẫn không phải là rất hữu ích trong lĩnh vực này.

Cảm ơn

+3

Sử dụng IO hơi nước để nhận được các byte thừa, như được đề xuất tại http://stackoverflow.com/questions/8751185/fortran-binary-file-format –

+0

Tôi không thấy đây là bản sao của câu hỏi khác , có lẽ ai đó có thể đóng cái này? – steabert

+2

Điều này khác với câu hỏi khác ... về cơ bản tôi không hỏi làm thế nào để thay đổi đầu ra fortran (mặc dù điều đó không giải quyết vấn đề của tôi), tôi hỏi làm thế nào để có được gnuplot để đọc trong dữ liệu. –

Trả lời

4

Testing với gnuplot 5.0, sau fortran dữ liệu chưa định dạng ghi của một mảng đôi x kích thước N,

open(FID,file='binaryfile') 
do k = 1, N 
    write(FID) x(k) 
end do 
close(FID) 

có thể được hiểu bởi gnuplot như sau:

plot 'binaryfile' binary format="%*1int%double%*1int" 

Các %*1int có nghĩa là, bỏ qua một lần một số nguyên bốn byte, có hiệu quả bỏ qua dữ liệu đầu trang và chân trang fortran kết thúc tốt đẹp xung quanh đầu ra.

Để biết thêm thông tin và ngoại suy cho dữ liệu phức tạp hơn, hãy xem tài liệu gnuplot 5.0 trên nhị phân và xem kích thước của các định dạng bằng, show datafile binary datasizes. Tuy nhiên, lưu ý rằng dữ liệu nhiều cột (nghĩa là N tăng gấp đôi mỗi lần ghi) có thể được truy cập với cùng định dạng như trên nhưng như là %Ndoubles trong đó N là một số nguyên. Sau đó, với using 1:3 ví dụ, một sẽ vẽ cột đầu tiên so với thứ 3.

+0

Đây là câu trả lời đúng cho câu hỏi đặt ra, và chắc chắn đóng góp kiến ​​thức. Cảm ơn vì đăng! – jvriesem

6

Nó có thể được dễ dàng hơn để sử dụng trực tiếp I/O thay vì tuần tự:

inquire (iolength = irec) matrix(1,:) !total record length for a row 
open (3, file=filename, form="unformatted", access="direct", recl=irec) 
write(3, rec=1) matrix(i,:) 

Tuyên bố inquire mang đến cho bạn chiều dài của danh sách đầu ra trong các đơn vị 'recl'. Như vậy, toàn bộ danh sách phù hợp với một bản ghi có độ dài irec.

Đối với văn bản một ma trận để nộp cột khôn ngoan sau đó bạn có thể làm:

inquire (iolength = irec) matrix(:,1) 
open (3, file=filename, form="unformatted", access="direct", recl=irec) 
do i=1,ncol 
    write(3, rec=i) matrix(:,i) 
end do 

hoặc hàng khôn ngoan:

inquire (iolength = irec) matrix(1,:) 
open (3, file=filename, form="unformatted", access="direct", recl=irec) 
do i=1,nrow 
    write(3, rec=i) matrix(i,:) 
end do 

hoặc yếu tố khôn ngoan:

inquire (iolength = irec) matrix(1,1) 
open (3, file=filename, form="unformatted", access="direct", recl=irec) 
do j=1,ncol 
    do i=1,nrow 
     write(3, rec=j+(ncol-1)*i) matrix(i,j) 
    end do 
end do 

hoặc đổ toàn bộ ma trận:

inquire (iolength = irec) matrix 
open (3, file=filename, form="unformatted", access="direct", recl=irec) 
write(3, rec=1) matrix 
+3

Đây là một câu trả lời tuyệt vời, và rất hữu ích, nhưng tiếc là tôi không nghĩ rằng nó trả lời câu hỏi: "làm thế nào để tôi nhận được gnuplot để đọc dữ liệu nhị phân với đệm" –

+0

Nó sẽ phù hợp hơn với câu hỏi OP khác của http: // stackoverflow.com/questions/8751185/fortran-binary-file-format –

8

Andrew: Tôi không thấy lý do nào để làm cho gnuplot xử lý các byte thừa đó trước/sau dữ liệu của bạn. Hoặc là Fortran không làm việc đệm này, hoặc nó và gnuplot xử lý nó mà không gặp rắc rối.

Tôi đã gặp sự cố tương tự và tìm kiếm của Google luôn mang tôi trở lại đây. Tôi nghĩ rằng tôi nên đăng giải pháp của mình trong trường hợp điều tương tự cũng xảy ra với người khác.

Tôi đã cố gắng tạo một bản đồ colormap 2D bằng cách sử dụng lệnh "plot 'file.dat' matrix của gnuplot với lệnh" image ". Tệp đầu ra ASCII của tôi quá lớn nên tôi muốn sử dụng tệp nhị phân thay thế. Những gì tôi đã làm là một cái gì đó như sau:

trong fortran:

implicit none 
real, dimension(128,128) :: array 
integer :: irec 

! ... initialize array ... 

inquire(iolength=irec) array 
open(36, 'out.dat', form='unformatted', access='direct', recl=irec) 
write(36, rec=1) array 
close(36, status='keep') 

trong gnuplot:

plot 'out.dat' binary array=128x128 format="%float" with image 

Ghi chú:

  • Theo mặc định, gnuplot giả định chính xác duy nhất trong các tệp nhị phân. Nếu kết quả đầu ra của chương trình forchan với độ chính xác gấp đôi, chỉ cần thay đổi "% float" thành "% double".

  • Chương trình của tôi đã sử dụng dữ liệu chính xác kép trong mảng, nhưng tệp đầu ra quá lớn.Vì hình ảnh dựa trên độ chính xác gấp đôi hoặc đơn là không thể phân biệt được với mắt và các tệp dữ liệu có độ chính xác kép là lớn, tôi đã chuyển đổi dữ liệu chính xác kép thành dữ liệu chính xác đơn trước khi ghi vào tệp.

  • Bạn có thể phải điều chỉnh lệnh gnuplot tùy thuộc vào những gì bạn muốn làm với ma trận, nhưng điều này tải nó vào và vẽ nó . Điều này đã làm những gì tôi cần nó để làm, và tôi hy vọng nó sẽ giúp bất cứ ai
    người khác có vấn đề tương tự. Bạn có thể thấy, nếu Fortran thêm các byte thừa trước/sau dữ liệu của bạn, gnuplot dường như đã đọc trong dữ liệu mà không làm cho bạn nhận thêm thêm byte vào tài khoản.

+0

Tôi muốn chỉ ra rằng câu trả lời này không thực sự trả lời bài đăng gốc. Trong khi Andrew muốn một cách để bỏ qua byte thông tin tiêu đề, câu trả lời của tôi cung cấp một cách tốt hơn để xuất dữ liệu Fortran. Fortran DOES in byte tiêu đề (thử nghiệm với ifort 15.0.1 20141022), nhưng đây thường là một tính năng rất không mong muốn của Fortran, so với các ngôn ngữ lập trình khác và các quy ước I/O. Câu trả lời của tôi cung cấp một cách để thực hiện I/O trong Fortran KHÔNG có byte tiêu đề. Trong cả hai @Andrew Spott và HAL 9001 của mã, các byte tiêu đề được bao gồm. – jvriesem

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