2009-10-05 3 views
14

bash에서 matlab을 비 대화식으로 호출하고 Matlab 외부에서 그 결과를 사용하려고합니다. 내가 bash는Matlab의 시작 메시지를 표시하지 않음

$ matlab -nosplash -nodesktop -nodisplay -r test 
Warning: No window system found. Java option 'MWT' ignored 

         < M A T L A B (R) > 
       Copyright 1984-2008 The MathWorks, Inc. 
        Version 7.7.0.471 (R2008b) 
         September 17, 2008 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 


ans = 

0.8147 0.9134 0.2785 0.9649 
0.9058 0.6324 0.5469 0.1576 
0.1270 0.0975 0.9575 0.9706 

에서 실행하면

예를 들어, 내가 matlab에의 시작 메시지를 표시 만하지 않고 또한 결과를 표시하는 스크립트 test.m

rand(3,4) 
quit 

을 것이 가능해야 "ans =".

참고이 예제뿐만 아니라 일반적인 질문을하고 있습니다.

감사합니다.

+0

Octave에서는'-q' 플래그를 사용할 수 있습니다. – sffc

답변

9

Unix 명령 "tail + n"을 사용하여 출력의 첫 번째 n 줄을 제거 할 수 있습니다. 머리글은 10 줄처럼 보이므로이 줄이 벗겨집니다.

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10 

이 (즉, "아니오 윈도우 시스템"과 같은) 경고가 제거 얻을 것이다 때문에,하지만, 조금 깨지기 쉬운, 그리고 헤더 크기는 경고 일 (그 경고가 유용한 진단이다) 무엇에 따라 달라집니다. 또한이 경고는 STDOUT 대신 STDERR에있을 수 있으므로 "꼬리 +9"가 필요한 것일 수 있습니다.

fopen/fprintf/fclose를 사용하여 별도의 파일에 쓰도록 Matlab 스크립트를 수정하는 것이 더 강력한 방법 일 수 있습니다. 이렇게하면 Matlab의 헤더, 경고, 오류 등이 원하는 형식의 출력과 분리됩니다. "disp"출력을 별도의 파일 핸들로 이동하려면 evalc를 사용하여 캡처 할 수 있습니다. outfile은 -r 메시지의 test()에 대한 인수와 다중 프로세스 환경에서의 충돌을 방지하기 위해 파일 이름에 통합 된 $$ env 변수 (bash 프로세스의 PID)를 사용하여 지정할 수 있습니다.

function test(ppid) 
outfile = sprintf('outfile-%d.tmp', ppid); 
fh = fopen(outfile, 'w'); 
myvar = rand(3,4); 
str = evalc('disp(myvar)'); 
fprintf(fh, '%s', str); 
fclose(fh); 

bash에서 호출하려면이 호출 양식을 사용하십시오. (여기에 사소한 구문 문제가 될 수 있음; 내가 지금에 테스트 할 수있는 유닉스 박스가 없습니다.)

% matlab -nosplash -nodisplay -r "test($$)" -logfile matlab-log-$$.tmp 

것은의 당신의 bash는 PID가 1234이 이제 OUTFILE-1234에서 출력을 가지고있다 가정 해 봅시다. tmp와 matlab-log-1234.tmp의 Matlab 로그. pwd에 의존하고 싶지 않으면/tmp에 집어 넣으십시오. 단일 MATLAB 호출에서 여러 출력 파일을 작성하기 위해이를 확장하여 여러 것을 계산해야하는 경우 시작 비용을 절약 할 수 있습니다.

+2

'-n + tail '은'-n + 10'이 아닌'-n'인가? – elaRosca

+1

'꼬리'버전에 따라 다릅니다. '-n'이없는 문법은 이전 버전이며, 내가 일하는 OS X를 포함하여 일부 지역에서 여전히 지원됩니다. 내가 게으르므로 익숙해 져서 사용합니다. '-n'을 포함 시키면 더 이식성 있고 아마도 더 읽기 쉽습니다. –

2

출력을 파일로 저장 한 다음 해당 파일을 읽는 것이 좋습니다. 이 접근법은 약간 더 복잡하지만 형식이 바뀌면서 덜 부서지기 때문에 훨씬 더 많은 제어가 가능합니다. Matlab 파일을 다른 호스트 언어로 변환하기 위해 웹에서 많은 스크립트를 찾을 수 있습니다.

예 :

A = randn(3, 2); 
save temp_output.mat A 
# Later, read temp_output.mat in whichever language you desire. 
2

ans =의 표시를 억제하려면, 당신은 DISP 기능을 사용할 수 있습니다

disp(rand(3,4)); 

가 첫 번째 경고 메시지를 표시하기를, 당신은에 옵션 -nojvm에 추가 시도 할 수 있습니다 도움이되는지 확인하십시오.

다른 모든 것을 억제하려면 동일한 문제를 해결하는 MathWorks 뉴스 그룹 스레드에서 this solution을 시도하십시오. 시작 메시지와 (당신이 원하는 무엇이든 이름을 지정할 수 있습니다)에 matlab.output 파일에 다른 표시 출력을 모두 덤프이

matlab -nodisplay <test.m &>matlab.output 

같은 MATLAB을 호출

+1

-nojvm이 시작 메시지 (예 : " ...")를 표시하지 않습니다. – Tim

+0

@Tim : 잘못 입력 한 것입니다. 나는 그것이 경고 메시지에 도움이 될 것이라고 제안하려고했다. 나는 그것을 고쳐 줄 것이다. – gnovice

1

. (피터의 제안 다음) 당신은 당신이

csvwrite('temp_output.txt',A) 

또는이 파일에 읽고 진행할 수있는 다른 적절한 출력 기능을 사용하여 파일을 필요로하는 결과를 저장 test.m있는 경우. -logfile 명령 줄 옵션을 사용하여

11

시도 :

-logfile log   - Make a copy of any output to the command window 
         in file log. This includes all crash reports. 

그런 다음 당신은 쉽게 (예를 들어 나오지도) 당신이 원하는 어떤 방법을 사용하여 처음 몇 줄을 제거 할 수 있습니다.예 : MATLAB 시작시

-wait  - MATLAB is started by a separate starter program 
      which normally launches MATLAB and then immediately 
      quits. Using the -wait option tells the starter 
      program not to quit until MATLAB has terminated. 
      This option is useful when you need to process the 
      the results from MATLAB in a script. The call to 
      MATLAB with this option will block the script from 
      continuing until the results are generated. 

상세 정보 : 또한

matlab.exe -nosplash -nodesktop -nojvm -logfile out.log -r 'rand(3,3), exit' 
sed '1,5d' out.log 

당신이 그것을 계속하기 전에 실행 완료해야하는 스크립트에서 실행하는 경우는 -wait 옵션을 사용하여 옵션은 here 또는 실행 가능 참조 페이지에서 찾을 수 있습니다./Unix

+0

MATLAB 시작 옵션에 대한 자세한 내용은 여기를 참조하십시오. http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

관련 문제