I'm currently working on a project where I am trying to predict a presidential election based on the population density and region of a voter. I wrote a few MATLAB functions to parse the data, but it takes about a minute to run, which seems long. My languages of choice are usually Java or Python and I feel like this calculation would only top a few seconds in those languages.
Quick side note: although this is for a school project, it is a simulation class, not a programming class. The code works, which is what is required, the efficiency of the code is personal interest.
Main test script
%test metrics
printf("starting test\n");
p0 = parsePopMap("density2010.png"); %not shown because this returns quickly
[vm,rp,dp] = metrics(p0);
printf("republican:%d\ndemocrat:%d\n",rp,dp)
metrics.m
%generate matrix determining republican vote
function [voteMatrix,republicanPixels,democratPixels] = metrics(popGraph)
voteMatrix = zeros(rows(popGraph),columns(popGraph));
republicanPixels=0;
democratPixels=0;
printf("loading regions\n");
%regions is a matrix of size == popGraph, has values from 1-6
%so that any regions(row,column) returns the region of the country
load regions; %based on the printout, this happens within seconds
printf("calculating votes\n");
%suspected bottleneck
for r = [1:rows(popGraph)]
for c = [1:columns(popGraph)]
pixelRegion = regions(r,c);
if (pixelRegion == 6)
voteMatrix(r,c)=-1; %because it is water
else
vote = voteFromLocation(pixelRegion,popGraph(r,c));
voteMatrix(r,c) = vote;
if vote>.5
republicanPixels +=1;
else
democratPixels +=1;
end
end
endfor
endfor
voteFromLocation.m
function vote = voteFromLocation(region,popDens)
% array is percent for urban, suburban, rural
% probability area will vote republican
voteAverage = [ [.375,.51,.79];%pacific coast
[.40,.54,.765];%midwest
[.30,.47,.48];%Northeast
[.485,.625,.725];%south
[.46,.62,.795]];%Mountains/plains
voteDelta = [ [.05,.06,.1];%pacific coast
[.04,.04,.07];%midwest
[.12,.06,.10];%northeast
[.09,.07,.27];%south
[.12,.08,.21]];%mountains/plains
%represents the max value of that demographic
ruralThresh = 900; %so <=900 is rural
subThresh = 1100; % 900<x<=1100 is suburban
%urban is anything above 1100
demo = -1;
if(popDens<=ruralThresh)
demo = 3;
elseif(popDens<=subThresh)
demo = 2;
else
demo = 1;
end
mean = voteAverage(region,demo);
stdDev = voteDelta(region,demo);
probVoteRep = (mean + stdDev * randn());
vote = probVoteRep;
I believe the source of the bottleneck is the for
loops of metrics.m
. Most matrix processing I've seen uses different approaches, which I believe may be faster.