2013-07-12 2 views
0

MATLAB 코드 조각을 각각 JAVA으로 바꾸는 데 상당히 문제가 있습니다. 다음Java에서 이진 파일 쓰기

MATLAB에서 작동 그러므로

fid = fopen('test.wnd','w'); 
fwrite(fid, -99, 'int16'); 
fwrite(fid, 7, 'int16'); 
fwrite(fid, 92, 'int32'); 
fwrite(fid, 3, 'int32'); 
fwrite(fid, 75.0, 'float32'); 
fwrite(fid, 75.0, 'float32'); 
fwrite(fid, 3.0, 'float32'); 
fwrite(fid, 2048, 'int32'); 
fwrite(fid, 8.0, 'float32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 340.2, 'float32'); 
fwrite(fid, 0, 'int32'); 
fwrite(fid, 12, 'int32'); 
fwrite(fid, 3, 'int32'); 
fwrite(fid, 3, 'int32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 113.4, 'float32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 0, 'float32'); 
fwrite(fid, 27.72, 'float32'); 
fwrite(fid, 12, 'float32'); 
fwrite(fid, 340.2, 'float32'); 

Scale = [1.0 .8 .5]; 
Offset = [8.0 0 0]; 

v = zeros(3*3,1); 

for it = 1:nt 
    cnt = 1; 
    for iz = 1:nz 
     for iy = y_ix 
      for k=1:nffc 
       v(cnt) = ((velocity(it,k,iy,iz) - Offset(k))/Scale(k)*1000); 
       cnt = cnt + 1;     
      end %for k 
     end %iy 
    end % iz 

    fwrite(fid_wnd, v, 'int16'); 

end %it 
fclose(fid); 

, JAVA에서이 시도 :

DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:/Users/fperrone/Desktop/test.wnd")); 
dos.writeShort(-99); 
dos.writeShort(7); 
dos.writeInt(92); 
dos.writeInt(3);   
dos.writeFloat((float)75.0); 
dos.writeFloat((float)75.0); 
dos.writeFloat((float)2.4); 
dos.writeInt(2048); 
dos.writeFloat((float)8.0); 
dos.writeFloat((float)0); 
dos.writeFloat((float)0); 
dos.writeFloat((float)340.2); 
dos.writeInt(0); 
dos.writeInt(67); 
dos.writeInt(3); 
dos.writeInt(3); 
dos.writeFloat((float)0); 
dos.writeFloat((float)0); 
dos.writeFloat((float)113.4); 
dos.writeFloat((float)0); 
dos.writeFloat((float)0); 
dos.writeFloat((float)27.72); 
dos.writeFloat((float)12); 
dos.writeFloat((float)340.2); 
double[] Offset = {8.0, 0.0, 0.0}; 
double[] Scale = {1.0, .8, .5}; 
short v[] = new short[9]; 
     for(int it = 0; it < 4096; ++it){ 
      for(int comp = 0; comp < 3; ++comp){ 
       int count = 0; 
       for(int iy = 0; iy < 3; ++iy){ 
        for(int iz = 0; iz < 3; ++iz){ 
         v[count] = (short) ((test[it][comp][iy][iz] - Offset[comp])/Scale[comp]*1000); 
         dos.writeShort(v[count]); 
         count += 1; 
        } 
       } 
      }   
     }  
     dos.close(); 

중요한 점은 난과 JAVA 출력을 연결할 때 바이너리 파일이 의미하는 소프트웨어입니다.이 소프트웨어는 아무 정보도 읽지 않으며, MATLAB 출력이 다시 나타납니다. 광고를 완벽하게 예상대로

무엇이 누락 되었습니까?

+2

Java 결과 바이너리와 MATLAB 결과 바이너리를 비교 했습니까? 그것은 엔디 언이나 그런 헛소리 일 수 있습니까? – Shark

+1

첫 번째 '7'(matlab의 int16) – resueman

+0

에 대한 writeShort()가 오타였던 경우 writeInt()를 사용하는 것이 좋습니다. – fpe

답변

0

matlab 프로그램에서 fopen() 또는 fwrite()에 "machine format"을 지정하지 않았기 때문에 기본적으로 '기본'시스템 바이트 순서가 사용됩니다.

"machineformat"필드를 사용하여 Matlab에서 파일을 만드는 동안 바이너리 형식을 지정해야합니다.

FileID에 = fopen을 에 fwrite (허가 machinefmt, encodingIn는 파일명) (FileID 특정 A는, 정밀도가 스킵 machineformat) 여기서

추가 정보 : http://www.mathworks.com/help/matlab/ref/fopen.html http://www.mathworks.com/help/matlab/ref/fwrite.html

A로부터 정확한 읽기 자바 프로그램, 당신이 할 필요가 : fid = fopen ('test.wnd', 'w', s ');