Search code examples
matlabfunctionplotsumarea

Summing Values based on Area in Matlab


Im trying to write a code in Matlab to calculate an area of influence type question. This is an exert from my data (Weighting, x-coord, y-coord):

M =

15072.00 486.00 -292
13269.00 486.00 -292
12843.00 414.00 -267
10969.00 496.00 -287
9907.00  411.00 -274
9718.00  440.00 -265
9233.00  446.00 -253
9138.00  462.00 -275
8830.00  496.00 -257
8632.00  432.00 -253

R =

-13891.00   452.00  -398
-13471.00   461.00  -356
-12035.00   492.00  -329
-11309.00   413.00  -353
-11079.00   467.00  -375
-10659.00   493.00  -333
-10643.00   495.00  -338
-10121.00   455.00  -346
 -9795.00   456.00  -367
 -8927.00   485.00  -361
 -8765.00   467.00  -351

I want to make a function to calculate the sum of the weightings at any given position based on a circle of influence of 30 for each coordinate.

I have thought of using a for loop to calculate each point independently and summing the result but seems unnecessarily complicated and inefficient.

I also thought of assigning an intensity of color to each circle and overlaying them but I dont know how to change color intensity based on value here is my attempt so far (I would like to have a visual of the result):

function [] = Influence()

    M = xlsread('MR.xlsx','A4:C310');
    R = xlsread('MR.xlsx','E4:G368'); 
    %these are my values around 300 coordinates

    %M are negative values and R positive, I want to see which are dominant in their regions

    hold on
    scatter(M(:,2),M(:,3),3000,'b','filled')
    scatter(R(:,2),R(:,3),3000,'y','filled')
    axis([350 650 -450 -200])
    hold off
end

%had to use a scalar of 3000 for some reason as it isnt correlated to the graph size

I'd appreciate any ideas/solutions thank you

This is the same but with ca. 2000 data points


Solution

  • How about this:

    r_influence = 30;                                     % radius of influence
    r = @(p,A) sqrt((p(1)-A(:,2)).^2 + (p(2)-A(:,3)).^2); % distance
    wsum = @(p,A) sum(A(find(r(p,A)<=r_influence),1));    % sum where distance less than roi
    % compute sum on a grid
    xrange = linspace(350,550,201);
    yrange = linspace(-200,-450,201);
    [XY,YX] = meshgrid(xrange,yrange);
    map_M = arrayfun(@(p1,p2) wsum([p1,p2],M),XY,YX);
    map_R = arrayfun(@(p1,p2) wsum([p1,p2],R),XY,YX);
    
    figure(1);
    clf;
    imagesc(xrange,yrange,map_M + map_R);
    colorbar;
    

    Gives a picture like this:

    Resulting figure

    Is that what you are looking for?