有下面这样两个行列式:
想得到结果:
[ [a, 8 ] # 10 - 2
[b, 10] # 10
[c, 5] # 10 - 5
[d, 10] ] # 10
有下面这样两个行列式:
想得到结果:
[ [a, 8 ] # 10 - 2
[b, 10] # 10
[c, 5] # 10 - 5
[d, 10] ] # 10
不知道这个操作的数学定义是什么。
其实我就是做一个批量的加/减运算,场景就是第一次有 M 个人分别买入了多少份额的理财产品,第二次是M 中的 N 个人赎回了多少份额,现在我想知道赎回之后每个人各剩余多少钱。上面例子中的 a, b, c, d 其实就是投资人的 ID。
这两天研究一下,应该没有现成的 calc 函数,尝试了一下自定义 calc 函数,可是 calc 的 defmath
宏玩了半天没玩转
这个问题如果用纯数学的语言描述的话是什么样的?
……………… 就是 a b c d的初始值都是10,a 和 c 分别减2和5。
@lululau 感觉这种工作用excel之类的统计表格处理更合适,org的表格也能做这种简单的批量运算,底层也是调用calc。
会计工作可以试试CLT的ledger,Spacmacs 的finance layer用的就是这个。
嗯,谢谢,我研究下 finance layer
题外话: ledger 有很多用不同语言实现的版本,包括 Python, Haskell, Perl, C++, Go。甚至它的作者用Common Lisp写了一个原型,不过因为是原型所以没有在维护。
这个应用本身不编辑数据文件,所以需要一个编辑器,比如Emacs,来处理数据。
然后因为 ledger 把 ; # *
等都处理成注释符号,所以可以把数据嵌入在 org 里面使用。
貌似没什么数学含义,不过可以实现。
(defun my-vec-to-lst (vec)
(mapcar (lambda (x)
(list (cadadr x) (caddr x)))
(cdr vec)))
(defun my-lst-to-vec (lst)
`(vec ,@(mapcar
(lambda (x)
`(vec (var ,(car x) ,(intern (format "var-%s" (car x))))
,(cadr x)))
lst)))
(defun my-sub-lst (a b)
(loop for x in a
for z = (assoc (car x) b)
if z collect (list (car x) (- (cadr x) (cadr z)))
else collect x))
(defmath my-vsub (a b)
(interactive 2 "my-vsub")
(let* ((x (my-vec-to-lst a))
(y (my-vec-to-lst b))
(z (my-sub-lst x y)))
(my-lst-to-vec z)))
然后就可以使用命令 calc-my-vsub
(x
my-vsub
) 得到想要的结果。
(不小心搜到这里,手痒写之)