6

我试图让 Matlabs 的 MuPad 像 MathCad 一样漂亮和方便。

假设两个变量赋值:

x_a:=2*unit::mm;
y_b:=5*unit::mm;

我想要一个漂亮的(用Tex排版)输出,比如

z = x_a + y_b = 7 mm

我已经设法通过使用来做到这一点output::mathText(...)

output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)

看起来如所愿:

在此处输入图像描述

但这不是很方便且不可读。所以我试图把它包装成一个宏或一个函数:

evalPrint(z,x_a+y_b)

我怎样才能做到这一点?


我尝试了什么:

我写了一个程序如下:

evalPrint :=
proc(x,y) begin
  output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:

但我只是得到

在此处输入图像描述

我错过了什么?


关于horchler 的回答:他的第一个解决方案在某种程度上不起作用,而第二个解决方案则:

程序:

evalPrintVal := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y));
end_proc:
evalPrintEq := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y), " = ", context(y));
end_proc:
evalPrintEq2 := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:

称呼:

evalPrintVal(U_1,15000*unit::V);
evalPrintEq(E_h, U_1*1.05);
evalPrintEq2(E_h, U_1*1.05);

输出:

在此处输入图像描述

4

1 回答 1

4

这是范围的问题。MuPAD 与大多数其他编程语言没有什么不同,因为方法/函数/过程具有有限的词法范围DOM_VAR域类型是指过程的局部变量(这里多一点。在将变量传递给 Matlab 函数(用于此)之前,您无法直接看到变量的名称inputname,MuPAD 也不例外。此外,参数通常在传递到函数或过程之前进行评估。

幸运的是,就编码而言,修复非常简单。首先,您需要hold为您的proc. 这似乎既阻止了对输入参数的评估,又允许访问“过程调用中使用的形式的实际参数”。然后,您需要使用context来评估输出的最后一部分。生成的过程如下所示:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", context(y));
end_proc:

然后

x_a := 2*unit::mm;
y_b := 5*unit::mm;
evalPrint(z, x_a+y_b);
z;

返回

MuPAD输出一

但是,由于这是在一个过程中完成的,z因此没有像在您的内联表达式中那样在全局范围内为 的值分配值。evalassign为了解决这个问题,可以使用该函数:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:

现在返回7 mm类似于z您的内联表达式:

MuPAD 输出二

这种形式也很有效,而且稍微简洁一些:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:

在 R2015a 中测试。

于 2015-07-31T18:57:57.493 回答