由于我发现了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]
提前感谢您提供任何帮助。
答案 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)
提出问题的另一个解决方案。当全局标志listarith
为true
(这是默认值)时,许多算术运算都会在列表上进行分配。所以在你的例子中:
(%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