2012-04-10 16 views
10

यदि मैं यह matlab समारोहबैश स्क्रिप्ट में matlab से वापसी मूल्य कैसे प्राप्त करें?

function [result] = matlab_test(param1, param2) 

disp(sprintf('param1 : %s', param1)); 
disp(sprintf('param2 : %s', param2)); 

result = 'hello matlab'; 

है और मैं

matlab -nodesktop -nosplash -nodisplay -r "try, A=matlab_test('test','matlab'); end; quit" 
echo $A 

तरह बैश लिपि में इस matlab समारोह कॉल करना चाहते हैं और मैं इस उत्पादन

test 
matlab 
hello matlab 

मेरे आवश्यकता चाहते हैं यहाँ है यह पता लगाने के लिए कि क्या मेरे बैश स्क्रिप्ट में मैटलैब से रिटर्न वैल्यू का उपयोग करना संभव है और इसे पाइपलाइन के माध्यम से पास करना भी है। मैं केवल अपने आवेदन को छोटे घटकों (फाइलों) में अलग करना चाहता हूं और पाइपलाइन/पैराम्स के माध्यम से संवाद करना चाहता हूं। संक्षेप में, मैं देखना चाहता हूं कि मै मैटलैब स्क्रिप्ट को अपनी बैश स्क्रिप्ट में कितनी दूर लपेट सकता हूं ताकि मैं अपना कोड आर्किटेक्चर सेट कर सकूं।
यदि मैं ऐसा नहीं कर सकता, तो मैं बस उस हिस्से को बंडल कर दूंगा जिसे मुझे matlab से वापसी मान को मैटलैब स्क्रिप्ट में एक साथ जोड़ना होगा।

+0

मैंने आपके संशोधित प्रश्न का उत्तर देने का प्रयास करने के लिए अपना उत्तर संपादित किया। – Sevenless

+0

यदि रिटर्न वैल्यू एक छोटा पूर्णांक है, तो एक आसान समाधान यह है कि ['निकास (कोड)'] (http://au.mathworks.com/help/matlab/) का उपयोग करके इसे मैटलैब प्रक्रिया के निकास कोड के रूप में वापस करना है। ref/exit.html) कमांड। विंडोज़ पर कोशिश करते समय ''-wait'] (http://au.mathworks.com/help/matlab/ref/matlabwindows.html) कमांड लाइन तर्क' matlab' को मत भूलें। –

उत्तर

6

आप दो प्रश्न पूछ रहे हैं। मैं दोनों का जवाब दूंगा, जिसमें दूसरा ऑपरेटिंग सिस्टम (और मेरे लिए निश्चित रूप से असंभव) के आधार पर दूसरा असंभव क्यों हो सकता है, फिर एक समस्या पर निर्भर कार्यवाही पर एक सुझाव प्रदान करें।

सबसे पहले, मैं इस तरह की एक स्क्रिप्ट का उपयोग करता हूं जब मैटलैब को खोल के साथ बातचीत करने के लिए मिलता है।

[[email protected] ~]$ ./stack_ex test matlab 
Warning: No window system found. Java option 'MWT' ignored 

          < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


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

>> param1 : test 
param2 : matlab 
>> >> >> 

तो स्पष्ट रूप से स्थापित करने के वातावरण चर के दो संस्करणों में काम नहीं करता:

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
system(['export temp1=' A]); %doesn't work 
setenv('temp2',A); %also doesn't work, I'll explain why below 
exit 
EOF 
echo $temp1 
echo $temp2 

उत्पादन देता है। यह हमें आपके दूसरे प्रश्न पर ले जाता है।

'गूंज' की विफलता के पीछे कारण यह है कि system और setenv मैटलैब बंद होने पर बंद किए गए गोले बनाते हैं। ऐसा कहने के लिए, मैटलैब उस खोल के बाहर पर्यावरण चर सेट नहीं कर सकता है जिसे इसे कहा जाता है।

विंडोज सिस्टम के लिए इसके लिए एक कामकाज है in this posting, जो माइक्रोसॉफ्ट से एक उपकरण का उपयोग करता है। here का भी उल्लेख किया गया।

मुझे विश्वास नहीं है कि * निक्स सिस्टम के लिए मैटलैब के भीतर से पर्यावरण चर सेट करने के लिए वर्कअराउंड है।

आपके द्वारा वर्णित कुछ के समान कुछ करने का तरीका यहां दिया गया है।

मुझे लगता है कि गूंज का उपयोग वह नहीं है जो आप वास्तव में करना चाहते हैं। इसके बजाय, मुझे लगता है कि आप पर्यावरण चर में संग्रहीत स्ट्रिंग आउटपुट का उपयोग करना चाहते हैं ताकि शेल में कमांड या स्क्रिप्ट के साथ आगे के काम में उपयोग किया जा सके।

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay 
A=matlab_test('$1','$2'); 
setenv('temp1',A); %doesn't work 
[a b] = system(['echo ' '$' 'temp1']) 
exit 
EOF 

देते उत्पादन:: एक संभावित समाधान, निम्नलिखित होगा [XXXXXX @ गणना-0-138 ~] $ ./stack_ex_3 परीक्षण matlab चेतावनी: कोई खिड़की प्रणाली मिल गया। जावा विकल्प 'एमडब्ल्यूटी' पर ध्यान नहीं दिया

      < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


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

>> param1 : test 
param2 : matlab 
>> >> 
a = 

    0 


b = 

hello matlab 

यह दिखाता है कि आदेश echo $temp1setenv और temp1 द्वारा बनाई subshell में मूल्यांकन किया गया था यह करने के लिए आवंटित मूल्य रखती है। खोल के लिए इस कॉल का नतीजा अब बी में संग्रहीत है (एक धारण 0 सफलता का संकेत देता है)। यह कल्पना की जा सकती है कि आप सिस्टम कमांड के माध्यम से खोल में जो कुछ करना चाहते हैं उसे पारित कर सकते हैं, ताकि यह सबहेल में चलता है। यद्यपि इस दृष्टिकोण का पूर्ण मूल्यांकन देने के लिए हमें आपकी समस्या के बारे में और अधिक जानकारी जाननी होगी।

संपादन और फॉलोअप **********************

मैटलैब और बैश है कि मैं के बारे में सोच सकते हैं लपेटकर के निकटतम बात निम्नलिखित चाल है । आप पाइप निम्नलिखित के साथ myresult.out को मैटलैब स्क्रिप्ट से उत्पादन कर सकते हैं:

#!/bin/sh 

cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out 
A=matlab_test('$1','$2'); 
disp(['grepMe ' A]) 
exit 
EOF 

आप grepMe लाइन myresult.out से grep कर सकते हैं, SED के लिए पाइप, और उत्पादन लाइन की जरूरत का ही हिस्सा चुनें, फिर पाइप कि आपकी बाकी लिपि पर। यह उतना करीब है जितना मुझे लगता है कि आप जो भी करने की कोशिश कर रहे हैं उसे प्राप्त कर सकते हैं।

+0

कृपया मेरी आवश्यकता के बारे में अधिक स्पष्टीकरण के लिए मेरे प्रश्न में अद्यतन देखें। आपका जवाब अच्छा है लेकिन मुझे उस मूल्य को बैश स्क्रिप्ट के लिए भेजने के लिए और अधिक शानदार तरीका चाहिए। –

2

दो चीजें हैं जो आप यहां करने की कोशिश कर रहे हैं। सबसे पहले: एक खोल में एक Matlab कार्यक्रम के आउटपुट प्रदर्शित करें। दूसरा, खोल में एक चर निर्दिष्ट करें।

जब मैं इस की कोशिश की, मैंने पाया कि मैटलैब सभी अपने उद्घाटन संदेश के साथ stdout से अधिक लिखते थे, तो मैं क्या कर समाप्त हो गया:

mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output 

और फिर matlab के अंदर, साथ sprintf की जगह:

f = fopen('~/matlab_output', 'w'); 
fprintf(f, 'param1 : %s', param1); 
fclose(f); 

यह आपकी पहली आवश्यकता का एक समाधान है (आप केवल एक सामान्य फ़ाइल को लिख सकते हैं और उसके बाद फ़ाइल को बिल्ली दे सकते हैं, लेकिन इसके लिए आपको && का उपयोग करना होगा, इसलिए जब तक मैटलैब पूरी तरह से समाप्त नहीं हो जाता तब तक आप आउटपुट नहीं देख पाएंगे ।)। आपके पास दूसरा मुद्दा है - मैटलैब में "ए = परिणाम" करना और खोल में "$ ए गूंजना" करने में सक्षम होना कठिन है। तुम कर सकते हो कुछ की तरह:

mkfifo ~/matlab_commands 
mkfifo ~/matlab_output 
matlab ... > /dev/null & cat ~/matlab_output & eval $(cat ~/matlab_commands) 

और matlab में:

f2 = fopen('~/matlab_commands', 'w'); 
fprintf(f2, 'A=%s', double2str(results)); 
fclose(f2); 

लेकिन मैं वास्तव में नहीं जानता कि यह कैसे अच्छी तरह से काम करेगा।

2

पिछले कुछ दिनों में इस बारे में सोच रहे थे और बस कुछ सोचा था। आप MATLAB क्लोन में से एक को # के रूप में उपयोग कर सकते हैं! स्क्रिप्ट दुभाषिया। इस में मेरी पसंद, सप्टक है, इसलिए जैसे:

#! /usr/bin/octave -qf 
A=matlab_test('test','matlab'); 
printf(A) 

printf STDOUT में एक का मूल्य डालता है और आप यहां से पाइप कर सकते हैं।

[email protected][~]$ ./oshelltest 
param1 : test 
param2 : matlab 
hello matlab 
[email protected][~]$ ./oshelltest | grep hello 
hello matlab 

अब सप्टक बिल्कुल MATLAB के रूप में ही नहीं है, लेकिन यह आपकी आवश्यकताओं के लिए हो सकता है काफी करीब है,। यह भी मुक्त होने का लाभ है।

संबंधित मुद्दे