3

为了测试矩阵算法,我希望能够只用变量而不是数字来计算,但不改变算法本身。

我假设有一个解决方案(但可能还有其他同样受欢迎的解决方案)的方向是在 PDL 中使用多态性,或者用与 PDL 具有相同 API 的符号库替换 PDL 库。

为了说明我的观点,以下是使用 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('β');

这最终会在命名变量αβ(当然,拉丁变量名称ab应该同样可能)中输出一个术语矩阵。

理想情况下,算法中的任何内容都不必为此进行更改;最后,我想按原样测试算法,而不是不同的算法。在标题中添加use PDL::Symbolic qw( pdl );oruse SPDL qw( pdl );语句作为扩展或替换use PDL;对我来说似乎是不更改任何内容的规则的一个可以接受的小例外。

我想到的唯一解决方案基本上是重新实现 PDL API,至少是我的算法中使用的函数,并且可能对效率的考虑较少,但是使用符号对象而不是每个 piddle 单元格,并且可能扩展为较大的 piddles 中的单元格的索引命名功能,以提高可用性。

有没有比自己从头开始编写这个库更好的方法?

4

0 回答 0