【问题标题】:How to run a .m file from a tcl script (mac)如何从 tcl 脚本 (mac) 运行 .m 文件
【发布时间】:2012-11-21 09:49:14
【问题描述】:

有人知道我如何在我的 mac 上运行我的 tcl 脚本中的 matlab .m 文件。我想做一些链接这个:

  1. 在我的 .tcl 脚本中定义一些变量:

    # run_matlab.tcl:
    set a 1;
    set b 2;
    set c 3;
    
  2. 打开 matlab test.m 并使用预定义变量(在 tcl 中预定义)执行一些计算,例如:

    % test.m
    D = [a b c];
    E = [c b a]';
    F = D*E
    
  3. 回到 tcl 中基于 F 设置新变量(在 matlab 中计算)并使用 F 执行更多计算,例如:

    # run_matlab.tcl:
    set m $F;
    set n [expr 3*$m];
    puts $n
    

我是一个绝对的新手,不知道如何处理这个问题。有人可以帮帮我吗?

第一个解决方案

我已经做了一些事情,但我对此并不是 100% 满意。我的解决方案如下所示:

    # test.tcl
    # parameter definition
    set a 7;
    set b 5;

    # calculation of 'e' in matlab
    exec /Applications/MATLAB_R2012a.app/bin/matlab -nosplash -nodesktop -r test_matlab($a,$b);

    # input calculated variables
    # c = a+b = 2
    # d = a-b = 12
    source output.tcl

    # do further calculations
    set e [expr $c+$d];
    puts $e

Matlab .m 文件看起来像这样:

function test_matlab(a,b)
% calculate a and b
c = a+b;
d = a-b;
% output
fprintf(fopen(['output.tcl'],'a+'),'set c %f;\n',c);
fprintf(fopen(['output.tcl'],'a+'),'set d %f;\n',d);
% quit matlab
quit
end

所以有人可以看到,我将使用 'source output.tcl' 加载我的计算数据。

但是:有没有办法让我的变量直接进入 tcl 变量?那么列表呢?如果我在matlab中计算了一个向量,如何直接将这个向量保存到一个列表中?

【问题讨论】:

  • 有趣而清晰的问题。希望我能提供帮助,但我真的对如何与 Matlab 集成知之甚少……好吧,从任何东西都可以。 :-)
  • 我相信你已经看到了,但以防万一:wiki.tcl.tk/4135
  • 我不知道,但这不是只适用于 mircosoft windows 吗? :S

标签: macos matlab tcl


【解决方案1】:

我对 TCL 没有经验。但我相信你可以让它调用带有参数的命令。基本上你有两个选择:

  1. 从命令行调用 Matlab(see,尤其是matlab -r "statement")并将您的声明放入调用中。

  2. 您可以将您的 Matlab 脚本设置为服务器,并让它监听您发送命令和接收答案的某个端口。在 Windows 上,您还可以使用 COM 连接到 Matlab 并发送命令 - 但我找不到 Mac/Linux 上是否有类似的功能。

此外,您可以考虑使用mbuild 编译您的脚本。这样不仅可以分发它——而且我认为如果你编译成 java 可能更容易集成到 TCL 中。

【讨论】:

  • 谢谢,我已经稍微修改了我的问题。但仍有未解决的问题。
【解决方案2】:

您可以让 matlab 简单地打印两个值(在单独的行上或在一行上以空格分隔)。然后,在 Tcl 中:

set output [exec matlab ...]
lassign [split $output] c d
# do stuff with $c and $d

【讨论】:

  • 你能更准确一点吗?特别是根据matlab .m文件中函数的定义。我尝试了很多变化,但我无法让你的想法运行。谢谢
  • 我不知道matlab,但尝试删除2个fprintf语句并添加:fprintf(1,'%f %f\n',c,d);
  • 我知道了,谢谢。但是我仍然必须在 Matlab 中编写一个文件并将创建的文件加载到我的 .tcl 文件中。我的变量不再在 tcl 的“工作区”中,这就是我想要的。
  • 在这种情况下,您必须为 Tcl 找到一个 matlab 扩展。我google了一下,找到了Tmath。使用普通的 exec 是不可能做到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多