线性代数中的测试驱动开发



我想学习TDD,以便在科学编程(量子化学(中使用线性代数(或基本上使用矩阵(。然而,由于中间体是未知的,有时唯一已知的是最终结果,我不知道如何做到这一点。
你能告诉我你将如何在上面的例子中做TDD吗?

for i,j = start1:end1, k,l = start2:end2
A[i,j] = B[i,k] * C[k,l] * D[l,j]
end

其中A是在函数中计算的新矩阵
其中B C D是预定义的矩阵
其中start1、start2、end1、end2是预定义的整数。

在通常的程序中,我有大约20个这样的块。所以我想我对新的A一无所知。
我遇到的大多数错误都是简单的打字错误,比如

B[k,i]

而不是上述
如果最终结果是错误的,我唯一能做的调试方案是把所有东西都写两次,然后检查两个A,希望我没有两次犯同样的打字错误。

你能告诉我在上面的例子中你将如何进行TDD吗?

好消息是,您正在从根本上处理一个函数。

A = function(B,C,D,start1,end1,start2,end2)

我认为引入测试有两种通用方法

1( 从简单的问题开始——一个接一个的矩阵,单位矩阵;每次你计算出答案应该是什么,并检查功能是否产生了正确的答案

2( 从简单的验证开始-你可以从确保答案具有正确的行和列数开始,将其中一个输入加倍将输出加倍,等等。Nat Pryce对Diamond Kata的演示应该会让你了解这可能是如何工作的。

我用来测试矩阵乘法例程的一种技术是使用只有一个1的矩阵,其他都是零。设E(i,j(为矩阵

E(i,j)[k,l] = delta(i,k)*delta(j,l)

(在[i,j]处有1,在其他地方有0(代数表明

E(i,j)*E(i',j') = delta(j,i')*E(i,j')

测试是为了检查乘法例程是否获得所有具有nxn矩阵的pow(n,4(元组i,j,i',j'的写答案。

我的一个朋友向我展示了如何测试这些函数
这是通过模拟矩阵来完成的
你可以想象

B[i,k]    

作为

function B(i,k):    
return B[i,k]        

现在,您可以通过创建一个跟踪输入的列表来测试这些
这将提供以下功能。

function B(i,k):
list.append(i,k)
return B[i,k]

然后可以根据哪个索引更快来测试这个列表。这首先取决于列或行,以及如何定义循环,但您要么会得到以下内容:

1   1
1   2
1   3
2   1
2   2
2   3
3   1
3   2
3   3

1   1
2   1
3   1
1   2
2   2
3   2
1   3
2   3
3   3

现在,问题函数中的B[i,k]B[k,i]将生成不同的列表,因此您可以检测错误,从而进行测试。

相关内容

  • 没有找到相关文章

最新更新