module(..., package.seeall) ------------------------------------------------------------------------------------------ -- inicio: calculo de media e variancia em janelas ------------------------------------------------------------------------------------------ cellMath = {} -- calcula a media dos valores dentro de uma janela de amostragem function cellMath.mediaWindow(cs,attr) local total = 0 forEachCell(cs, function(cell) total = total + cell[attr] end ) return total/cs:size() end -- calcula a variancia dos valores dentro de uma janela de amostragem function cellMath.varianceWindow(cs,attr,media) local total = 0 local amount = 0 local position local idx -- armazena o indice da celula retornado forEachCell(cs, function(cell) total = total + (cell[attr] - media)^2 end ) return math.sqrt(total/(cs:size()-1)) end ------------------------------------------------------------------------------------------ -- final: calculo de media e variancia em janelas ------------------------------------------------------------------------------------------ function euclideanDistanceError(cs1, attr1, cs2, attr2) if cs1:size() ~= cs2:size() then print("Error: Data bases with diferrent sizes") return nil end local term1 = 0 local term2 = 0 local mediaCell1 = cellMath.mediaWindow(cs1,attr1) local mediaCell2 = cellMath.mediaWindow(cs2,attr2) local varCell1 = cellMath.varianceWindow(cs1,attr1,mediaCell1) local varCell2 = cellMath.varianceWindow(cs2,attr2,mediaCell2) sumSquareDiffer = 0 forEachCell(cs1, function(cell_1) local square_differ local cell_2 -- captura uma celula da cena 2 --cell_2 = cs2.cells[coord2index(cell_1.x,cell_1.y,resoMax)] cell_2 = cs2:getCell(Coord{x = cell_1.x,y = cell_1.y}) term1 = (cell_1[attr1] - mediaCell1)/varCell1 term2 = (cell_2[attr2] - mediaCell2)/varCell2 sumSquareDiffer = sumSquareDiffer +(term1 - term2)^2 end ) return math.sqrt(sumSquareDiffer) end