Skip to content

Instantly share code, notes, and snippets.

@caub
Last active August 29, 2015 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caub/fed822eb681a3f9d4813 to your computer and use it in GitHub Desktop.
Save caub/fed822eb681a3f9d4813 to your computer and use it in GitHub Desktop.
convolution product in js
function conv(a, b, mode){
var dl = b.length-1
var aa=a.concat(repeat(0, dl)) //0-padding
var c=[]
for(var i=0;i<aa.length;i++){
c[i]=0;
for(var m=0;m<aa.length;m++)
if (0<=i-m && i-m<b.length)
c[i]+=aa[m]*b[i-m];
}
if (mode=='same'){
var delta=Math.floor(b.length/2)
return c.slice(delta, delta+a.length)
}else if(mode=='valid'){
return c.slice(b.length-1, c.length-b.length+1)
}else
return c;
}
function conv2(a, b, mode){
var dl = b.length-1
var aa=[] //0-padding
aa=aa.concat( a.map(function(r){return r.concat(repeat(0, dl))}) )
for(var i=0;i<dl; i++)
aa.push(repeat(0, a.length+2*dl));
var c=[]
for(var i=0;i<aa.length;i++){
c[i]=[]
for(var j=0;j<aa[0].length;j++){
c[i][j]=0;
for(var m=0;m<aa.length;m++)
for(var n=0;n<aa[0].length;n++)
if (0<=i-m && i-m<b.length && 0<=j-n && j-n<b[0].length)
c[i][j]+=aa[m][n]*b[i-m][j-n];
}
}
if (mode=='same'){
var delta=Math.floor(b.length/2)
return c.slice(delta, delta+a.length).map(function(r){return r.slice(delta, delta+a.length)})
}else if(mode=='valid'){
return c.slice(b.length-1, c.length-b.length+1).map(function(r){return r.slice(b.length-1, c.length-b.length+1)})
}else
return c;
}
function repeat(x, n){
return Array.apply(null, {length:n}).map(function(){return x})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment