Maxima ezunits:将一个单位应用于列表的所有元素

时间:2016-11-15 12:50:24

标签: list units-of-measurement maxima

由于我发现了ezunits包,我在千里马中大量使用它,但我找不到一种令人满意的方法将单元应用于列表的元素。

例如[1,2,3]`hour显然有用

a: [1,2,3]`hour;
>> [1,2,3] ` hour

(5`km)/a[2];
>> 5/2 ` km/hour

但是我无法循环它

makelist((5`km)/x, x, [1,2,3]`hour);
>>> makelist: third argument must be a number or a list; found: [1.0,2.0,3.0] ` hour

然而,如果我手动将单位应用于列表的每个元素,那么一切正常:

makelist((5`km)/x, x, [1`hour,2`hour,3`hour]);
[5 ` km/hour,5/2 ` km/hour,5/3 ` km/hour]

提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:1)

如上所述

tellsimp是一个好主意。这是另一个取决于仅部分记录的distribute_over属性:

(%i7) :lisp (setf (get '$\` 'distribute_over) '(mlist $matrix mequal))
(MLIST $MATRIX MEQUAL)
(%i7) [1,2,3]`m;
(%o7)                        [1 ` m, 2 ` m, 3 ` m]

标点符号要非常小心!仔细区分反引号与单引号。

请注意,我已经通过列表,矩阵和方程式进行反引号分发,即

(a = b)`m

简化为:

a`m = b`m

当我编写ezunits包时,我考虑过自动对列表进行反引号分配,但决定反对它。你对这个主题有什么意见吗?我很想知道用户对此有什么看法。

答案 1 :(得分:0)

解决方法可能在以下功能中:

unit2list(l,u):= makelist(x`u,x,l)$

不是很优雅,但似乎有用。

答案 2 :(得分:0)

提出问题的另一个解决方案。当全局标志listarithtrue(这是默认值)时,许多算术运算都会在列表上进行分配。所以在你的例子中:

(%i22) a: [1,2,3]`hour;
(%o22)                         [1, 2, 3] ` hour
(%i23) (5`km)/a;
                                   5  5     km
(%o23)                         [5, -, -] ` ----
                                   2  3    hour
(%i24) %[2];
                                   5    km
(%o24)                             - ` ----
                                   2   hour