如何在bash脚本中从matlab获取返回值?

Jes*_*pin 11 bash matlab function return-value

如果我有这个matlab功能

function [result] = matlab_test(param1, param2)

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

result = 'hello matlab';
Run Code Online (Sandbox Code Playgroud)

我想在bash脚本中调用这个matlab函数

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

我想要这个输出

test
matlab
hello matlab
Run Code Online (Sandbox Code Playgroud)

我的要求是找到是否可以在我的bash脚本中使用Matlab的返回值,并将其传递给管道.我只想将我的应用程序分成小组件(文件)并通过管道/参数进行通信.简而言之,我想看看我可以在我的bash脚本中包装Matlab脚本的程度,以便我可以设置我的代码架构.
如果我不能这样做,我只需将我需要返回值的部分从matlab捆绑到matlab脚本中.

Sev*_*ess 7

你问了两个问题.我会回答这两个问题,包括为什么第二个问题根据你的操作系统可能是不可能的(我的工作系统肯定是不可能的),然后就问题依赖的解决方法提出建议.

首先,我在使用Matlab与shell进行交互时使用这样的脚本.

#!/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
Run Code Online (Sandbox Code Playgroud)

给出输出:

[XXXXXX@compute-0-138 ~]$ ./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
>> >> >> 
Run Code Online (Sandbox Code Playgroud)

很明显,设置环境变量的两个版本不起作用.这引出了我们的第二个问题.

未能"回响"背后的原因是,无论systemsetenv创造Matlab的时候关闭已关闭的炮弹.也就是说,Matlab无法在调用它的shell之外设置环境变量.

有讨论这个解决方法对于Windows系统在这个帖子中,使用微软的工具.这里也提到.

我不相信*nix系统可以在Matlab中设置环境变量.

这是一种类似于你所描述的方法.

我假设使用echo并不是你真正想做的事情.相反,我猜你想使用存储在环境变量中的字符串输出来进一步使用shell中的命令或脚本.一种可能的解决方法如下:

#!/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
Run Code Online (Sandbox Code Playgroud)

输出:[XXXXXX @ compute-0-138~] $ ./stack_ex_3 test matlab警告:未找到窗口系统.Java选项'MWT'被忽略

                            < 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
Run Code Online (Sandbox Code Playgroud)

这表明命令echo $temp1是在创建的子shell中计算的setenv,temp1保存分配给它的值.对shell的这个调用的结果现在存储在b中(保持0表示成功).可以想象,您可以通过系统命令传递您想要在shell中执行的所有操作,以便它在子shell中运行.我们必须知道您问题的更多细节,以便对此方法进行全面评估.

编辑和跟进**********************

最接近我能想到的包装Matlab和bash的是下面的技巧.您可以将Matlab脚本的输出通过myresult.out以下方式管道输出:

#!/bin/sh 

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

你可以从grepMeline myresult.out,sed到sed,然后只选择你需要的输出行部分,然后在你脚本的其余部分输出.这就像我认为你可以达到你想要做的那样接近.