即使您没有向我们展示任何解决代码的尝试,但这是一个很好的练习,我不介意处理。您可以首先生成一个以原点为中心、跨越-r 和+r 的坐标网格。请记住,如果我对您的问题的解释正确,则 2D 网格中每个点之间的间距为 1。
一旦你这样做了,你可以找到那些欧几里得距离严格小于r的位置,然后返回满足这个条件的点数。要生成点的方形网格,请使用meshgrid。假设您在r 中定义了半径,您将执行以下代码:
[x,y] = meshgrid(-r:r, -r:r);
x = x(:);
y = y(:);
num_points = sum(x.^2 + y.^2 < r^2);
x = x(:); 和 y = y(:); 很重要。这会将每个 x 和 y 的 2D 网格转换为单列向量。具体来说,它采用矩阵的每一列,并将所有列从上到下堆叠以形成一个向量。它使分析更容易。原因是如果我们尝试在二维矩阵上使用sum,它只能在一个方向上求和。您可以单独对所有列求和,也可以对所有行单独求和。由于您想对整个数组求和,您可以调用sum 两次,或者将您的二维网格转换为一维数组的堆栈。我选择了第二种方法,因为我认为它更简洁,但有些人也不介意将 sum 调用链接在一起......这只是一种风格偏好。
完成此操作后,我们只需检查欧几里得距离是否小于半径。请注意,我正在计算欧几里得平方距离以避免计算平方根。它将节省计算时间。然后我们对所有实例求和,这将定义有多少点落在半径内。
例如,假设我们的半径是r = 2。这就是我们的meshgrid 积分的样子:
r = 2;
[x,y] = meshgrid(-r:r, -r:r)
x =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
对于 2D 网格中的每个坐标,我们在每个点都有一个 (x,y) 对。我们最终得到的分数是:
num_points =
9
这是有道理的,因为严格小于 2 的点应该只是以原点为中心的 3 x 3 块。如果您想确定,让我们在将坐标转换为一维向量之前可视化网格的外观:
[x,y] = meshgrid(-r:r, -r:r);
disp(x.^2 + y.^2 < r^2);
0 0 0 0 0
0 1 1 1 0
0 1 1 1 0
0 1 1 1 0
0 0 0 0 0
1 的位置表示true,这意味着该坐标满足它严格小于r。 0 的位置表示false,这意味着它们在外面。算法的最后一部分是对所有这个数组求和,得到 9,这就是严格在 r 内的点数。
希望这会有所帮助。祝你好运!