微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如果我有这个matlab函数
function [result] = matlab_test(param1,param2)

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

result = 'hello matlab';

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

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

我想要这个输出

test
matlab
hello matlab

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

你在问两个问题.我会回答两者,包括为什么第二个可能是不可能的,这取决于你的操作系统(并且绝对不可能在我的),然后提出一个关于解决问题的解决方案的建议.

首先,当使用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

给出输出

[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
>> >> >>

所以很明显,设置环境变量的两个版本都不起作用.这使我们得到你的第二个问题.

“echo”失败的原因是,系统和setenv都会在Matlab关闭时创建关闭的shell.也就是说,Matlab无法在调用它的shell外设置环境变量.

一个解决方法为这个Windows系统讨论了in this posting,它使用的工具来自微软.也提到here.

我不相信* 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

给出输出
[XXXXXX @ compute-0-138〜] $./stack_ex_3测试matlab
警告:找不到窗口系统.忽略Java选项’MWT’

< M A T L A B (R) >
                  copyright 1984-2010 The MathWorks,visit www.mathworks.com.

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

     0


b =

hello matlab

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

编辑和追踪**********************

最贴切的包装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

您可以从myresult.out,管道grep gre线到sed,并且只选择所需输出行的一部分,然后在脚本的其余部分管道.这是我认为你可以达到你想要做的一样接近.

原文地址:https://www.jb51.cc/bash/383888.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐