我有一个小的C#项目涉及到矩阵。我通过将大量数据分成n长度块,将这些块当作向量处理,并乘以一个Vandermonde**矩阵来处理数据。问题是,根据条件,块的大小和相应的Vandermonde**矩阵的大小会发生变化。我有一个通用的解决方案,易于阅读,但速度太慢:
public byte[] addBlockRedundancy(byte[] data) {
if (data.Length!=numGood) D.error("Expecting data to be just "+numGood+" bytes long");
aMatrix d=aMatrix.newColumnMatrix(this.mod, data);
var r=vandermonde.multiplyBy(d);
return r.ToByteArray();
}//method
在我的i5 U470 @ 1.33GHz上,此代码可以处理大约每秒1/4兆字节。我可以通过手动将矩阵乘法内联来加快速度:
int o=0;
int d=0;
for (d=0; d<data.Length-numGood; d+=numGood) {
for (int r=0; r<numGood+numRedundant; r++) {
Byte value=0;
for (int c=0; c<numGood; c++) {
value=mod.Add(value, mod.Multiply(vandermonde.get(r, c), data[d+c]));
}//for
output[r][o]=value;
}//for
o++;
}//for
这个程序每秒可以处理大约1兆字节。
请注意,“mod”是在GF(2^8)模下执行操作。
我知道这个程序可以更快:毕竟,Vandermonde矩阵大多数都是零。我应该能够编写或找到一种程序,可以将我的矩阵转换为一个优化的方法,以更快地有效地通过给定的矩阵乘以向量。然后,当我将一个5x5 Vandermonde矩阵(即单位矩阵)提供给此程序时,不需要执行任何算术运算,原始数据只需复制即可。
请注意:当我使用术语“Vandermonde”时,实际上是指附加了一些来自Vandermonde矩阵的行的单位矩阵(请参见注释)。由于该矩阵有许多零,并且如果您删除足够的行(自己选择)使其成为正方形,则它是可逆矩阵。当然,我希望使用相同的程序将这些反演矩阵之一转换为优化的指令系列。
如何使这个矩阵乘法更快?
谢谢!
(编辑以纠正我对Vandermonde矩阵的错误)