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

标签 bash function matlab return-value

如果我有这个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' 失败背后的原因是 systemsetenv 创建的 shell 在 Matlab 关闭时关闭。也就是说,Matlab 不能在调用它的 shell 之外设置环境变量。

讨论了 Windows 系统的解决方法 in this posting ,它使用 Microsoft 的工具。还提到了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, 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 $temp1 是在 setenv 创建的子 shell 中计算的,temp1 保存分配给它的值。调用 shell 的结果现在存储在 b 中(a 为 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

您可以从 myresult.out 中 grep grepMe 行,通过管道传输到 sed,并仅选择您需要的输出行部分,然后通过管道将其传输到其余的脚本。这与我认为您可以达到您想要做的事情一样接近。

关于bash - 如何在 bash 脚本中从 matlab 获取返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085184/

相关文章:

javascript - 使用 JavaScript 在 <div> 中打印多个 <p> 标签

c - 我正在尝试使用 C 解决给定总线数量的最大平台数量问题。我遇到错误并卡在那里

matlabFunction 删除输入参数

linux - 如何了解 Linux 硬盘上有多少空间?

linux - 比较两个服务器之间的文件校验和并报告不匹配

ruby - Sed 或 Perl : One file with regex instructions, 每行一条指令,在另一个文件上执行

javascript - 在javascript中的函数内存储函数的参数

当我使用 malloc 而不是 mxMalloc 时 MATLAB 崩溃

matlab - 在 Matlab 中更改分组条形图中的颜色

bash - 使用 AWK 递归查找