Kyl*_*ski 9 c# matrix matrix-multiplication
我有一个涉及矩阵的小型c#项目.我通过将其分成n长度的块,将chucks作为向量处理,并乘以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
Run Code Online (Sandbox Code Playgroud)
这可以在我的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
Run Code Online (Sandbox Code Playgroud)
这可以每秒处理大约1兆.
(请注意,"mod"正在GF(2 ^ 8)上模拟我最喜欢的不可约多项式.)
我知道这可以快得多:毕竟,Vandermonde**矩阵大多是零.我应该能够制定一个例程,或找到一个例程,它可以取我的矩阵并返回一个优化的方法,它将有效地将矢量乘以给定的矩阵,但速度更快.然后,当我给这个例程一个5x5 Vandermonde矩阵(单位矩阵)时,根本没有算术要执行,原始数据只是被复制.
**请注意:我使用的术语"Vandermonde",实际上是指一个Identity矩阵,其中附加了Vandermonde矩阵中的一些行(请参阅注释).这个矩阵很棒,因为所有的零,并且因为如果你删除足够的行(你选择的)使它成为正方形,它是一个可逆矩阵.当然,我想使用相同的例程将这些反转矩阵中的任何一个转换为优化的指令系列.
如何使这种矩阵乘法更快?
谢谢!
(编辑以纠正我与Vandermonde矩阵的错误)
也许您可以定义一个矩阵接口并使用Reflection.Emit在运行时构建实现。
IMatrix m = MatrixGenerator.CreateMatrix(data);
m.multiplyBy(...)
Run Code Online (Sandbox Code Playgroud)
在这里,MatrixGenerator.CreateMatrix将创建一个定制的 IMatrix 实现,具有完整的循环展开和进一步的代码修剪(0 单元、身份等)。MatrixGenerator.CreateMatrix可以缓存矩阵以避免稍后为同一组数据重新创建矩阵。