Pretty MuPad:在一行中输出赋值、表达式和结果——如何创建该函数?
Pretty MuPad: Output of assignment, expression and result in one line - How to create that function?
我正在尝试让 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:
但我刚得到
我错过了什么?
关于 :他的第一个解决方案不知何故不起作用,而第二个解决方案:
程序:
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);
输出:
这是scope. MuPAD is no different from most other programming languages in that methods/functions/procedures have a limited lexical scope. The DOM_VAR
domain type refers to a local variable of a procedure (a bit more here). You can't directly see the name of a variable before it's passed into a Matlab function (use inputname
的问题),MuPAD也不例外。此外,参数通常在 在 被传递到函数或过程之前被求值。
幸运的是,就编码而言,修复非常简单。首先,您需要使用 hold
option for your proc
. This appears to both prevent evaluation of input arguments and allow access to "the actual parameter in the form that was used in the procedure call." Then you need to use 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;
returns
但是,由于这是在过程中完成的,因此 z
的值并未像在内联表达式中那样在全局范围内分配值。要处理这个问题,可以使用 evalassign
函数:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:
现在 returns 7 mm
对于 z
就像你的内联表达式:
这种形式也可以,而且稍微更简洁:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
在 R2015a 中测试。
我正在尝试让 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:
但我刚得到
我错过了什么?
关于
程序:
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);
输出:
这是scope. MuPAD is no different from most other programming languages in that methods/functions/procedures have a limited lexical scope. The DOM_VAR
domain type refers to a local variable of a procedure (a bit more here). You can't directly see the name of a variable before it's passed into a Matlab function (use inputname
的问题),MuPAD也不例外。此外,参数通常在 在 被传递到函数或过程之前被求值。
幸运的是,就编码而言,修复非常简单。首先,您需要使用 hold
option for your proc
. This appears to both prevent evaluation of input arguments and allow access to "the actual parameter in the form that was used in the procedure call." Then you need to use 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;
returns
但是,由于这是在过程中完成的,因此 z
的值并未像在内联表达式中那样在全局范围内分配值。要处理这个问题,可以使用 evalassign
函数:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:
现在 returns 7 mm
对于 z
就像你的内联表达式:
这种形式也可以,而且稍微更简洁:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
在 R2015a 中测试。