我有一个涉及矩阵的小型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矩阵的错误)
学习D3会很高兴.看完很多例子后,我想我明白了.我的第一个项目是制作一个色轮,为简单起见没有过渡.但对我的第一个项目来说,即便这样也不够简单!对于零项目,我试图在屏幕上显示一些内容.希望我写的东西(亲爱的读已修复),而不是一个例子.
我做错了什么? http://jsfiddle.net/aGdMX/1/
var arc = d3.svg.arc()
.innerRadius(40)
.outerRadius(100)
.startAngle(0)
.endAngle(1)
;
var chart = d3.select("body").append("svg:svg")
.attr("class", "chart")
.attr("width", 420)
.attr("height", 420).append("svg:g")
.attr("transform", "translate(200,200)")
;
chart.selectAll("path")
.data(data)
.enter().append("svg:path")
.attr("fill", function(d, i){
return d3.rgb("black");
})
.attr("d", arc)
;
Run Code Online (Sandbox Code Playgroud)
谢谢