Matlab 不规则形状的蒙特卡罗模拟

Matlab 不规则形状的蒙特卡罗模拟,matlab,math,simulation,montecarlo,Matlab,Math,Simulation,Montecarlo,需要一个如何做到这一点的工作示例,我有一个显示湖泊形状的bmp文件,bmp的大小是矩形区域和已知的。我需要拍下这张照片,估计一下湖的大小。到目前为止,我有一个脚本,可以生成每个像素的巨大矩阵,告诉我它是否在湖中——但这不是蒙特卡罗!我需要生成随机点,并将它们与形状进行比较,这就是我被卡住的地方。我不知道如何在这里进行比较,我没有关于形状或线条的方程式,我只有确切的点信息——要么在湖中,要么不在湖中。所以我想我已经有了确切的面积,但我需要找到一种方法来比较随机点和这个 function Yes =

需要一个如何做到这一点的工作示例,我有一个显示湖泊形状的bmp文件,bmp的大小是矩形区域和已知的。我需要拍下这张照片,估计一下湖的大小。到目前为止,我有一个脚本,可以生成每个像素的巨大矩阵,告诉我它是否在湖中——但这不是蒙特卡罗!我需要生成随机点,并将它们与形状进行比较,这就是我被卡住的地方。我不知道如何在这里进行比较,我没有关于形状或线条的方程式,我只有确切的点信息——要么在湖中,要么不在湖中。所以我想我已经有了确切的面积,但我需要找到一种方法来比较随机点和这个

function Yes = Point_In_Lake(x,y,image_pixel)

[pHeight,pWidth]=size(image_pixel);
    %pHeight = Height in pixel
    %pWidth = Width in pixel

width = 1000; %width is the actual width of the lake
height = 500; %height is the actual height of the lake

%converting x_value to pixel_value in image_pixel
point_x_pixel = x*pWidth/width;  
xl = floor(point_x_pixel)+1;
xu = min(ceil(point_x_pixel)+1,pWidth);

%converting y_value to pixel_value in image_pixel
point_y_pixel = y*pHeight/height;
yl = floor(point_y_pixel)+1;
yu = min(ceil(point_y_pixel)+1,pHeight);

%Finally, perform the check whether the point is in the lake 
if (image_pixel(yl,xl)~=0)&&(image_pixel(yl,xu)~=0)&&(image_pixel(yu,xl)~=0)&&(image_pixel(yu,xu)~=0)
    Yes=0;
else
    Yes=1;
end
解决方案如下:

binaryMap = image_pixel

for i = 1:numel(image_pixel)

 xrand = randperm(size(image_pixel,1),1); 

 yrand = randperm(size(image_pixel,2),1); 

 Yes(i) = Point_In_Lake(xrand,yrand,binaryMap);

end

PercentLake = length(find(Yes==1))/length(Yes);

LakeArea = (PercentLake * 500000)/43560;

我不太明白你的问题在哪里。我假设蒙特卡罗方法的全部目的不是评估所有像素,而是随机选择其中的一部分。如果你能检查一个特定的像素是否在湖里,你就得到了你所需要的一切。只需生成一些统一选择的点,评估它们是否在湖中,并从中推断-或者我遗漏了什么?问题在于你所说的“评估它们是否在湖中”-这就是我需要的一个示例。当迭代所有像素时,如何确定给定像素是否在湖中?不管你是如何得到像素的,这个逻辑都是一样的。在Monte Carlo中,您只需随机生成像素位置。计算随机像素中湖泊像素的比例,除以生成的总数。这个比例乘以图像大小是对湖泊大小的估计。如果你的目标是在不评估太多像素的情况下确定湖泊大小,那么蒙特卡罗可能不是一个非常有效的方法。例如,您希望分散采样点,而不是随机选择采样点(因此可能从一个小区域中采样多个采样点)