【发布时间】:2022-03-10 11:25:34
【问题描述】:
为了测试矩阵算法,我希望能够只用变量而不是数字来计算,但不改变算法本身。
我认为有解决方案的方向(但可能还有其他同样受欢迎的解决方案)是在 PDL 中使用多态性,或者将 PDL 库替换为具有与 PDL 相同 API 的符号库。
为了说明我的观点,下面是一个使用 PDL 实现的简单算法:
use utf8;
use strict;
use warnings;
use PDL;
sub algorithm ($$) {
my $alpha = shift;
my $beta = shift;
my $A = pdl(
[ cos $alpha, -sin $alpha ],
[ sin $alpha, cos $alpha ],
);
my $B = pdl(
[ cos $beta, -sin $beta ],
[ sin $beta, cos $beta ],
);
print $A x $B;
}
现在来测试代码,而不是像这样的多次调用
algorithm 0.1, 0.1;
algorithm 0.2, 0.1;
algorithm 0.1, 0.2;
…
使用类似于
的单个调用algorithm 'α', 'β';
或者——同样可以接受——类似于
algorithm pdl('α'), pdl('β');
这最终会在命名变量α 和β 中输出一个术语矩阵(当然,拉丁变量名称a 和b 应该同样可能)。
理想情况下,算法中的任何内容都无需为此进行更改;最后,我想按原样测试算法,而不是不同的算法。在标题中添加use PDL::Symbolic qw( pdl ); 或use SPDL qw( pdl ); 语句作为use PDL; 的扩展或替换对我来说似乎是不更改任何内容规则的一个可以接受的小例外。
我想到的唯一解决方案基本上是重新实现 PDL API,至少是我的算法中使用的函数,并且可能不太考虑效率,但是使用符号对象而不是每个 piddle 单元格,并且可能扩展了较大 piddle 中的单元格的索引命名功能,以提高可用性。
有没有比自己从头开始编写这个库更好的方法?
【问题讨论】:
-
有趣的问题。也许你可以从Math::Symbolic 那里找到一些灵感。或者您可以尝试包装(使用 Perl XS)symengine SymPy 使用的 C++ 库。
-
我已经开始为 symengine C++ 库实现 Perl 绑定。如果你愿意,你可以测试它here。让我知道您还想在模块中实现什么。