如何在matlab矩阵中随机生成圆【含源代码】
言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。
该问题所涉及的知点并不多也不难,主要就是如何生成圆以及矩阵赋值操作。因为矩阵是离散数据集,因此对矩阵的大小要有一定的限制,比如在一个2✖2或5✖5的矩阵中生成随机圆显然是没有意义的。
巴山将按以下步骤来解决该问题:
首先,初始化一定大小元素值全为false的逻辑矩阵JZ,并定义一个取值为0到2π的角theta,定义角是因为圆的参数方程要用到。
其次,随机生成圆心和半径,当然都得在矩阵大小范围内,特别提醒,这里的圆心只能取整数值,因为矩阵索引值不能为小数。
最后,根据半径和圆心生成圆的位置坐标并取整,剔除超过矩阵大小范围的位置,将矩阵中对应位置设置为true即可
以下是main函数及子函数randCircle:
main函数:
子函数randCircle:
function [JZ,L] = randCircle(M) JZ = false(M,M); % 定义圆周角 theta = linspace(0,2*pi,round(M*2)); % 定义随机函数 rfun = @(a,b) a+(b-a)*rand; % 随机圆心和半径 C = round([rfun(1,M-1),rfun(1,M-1)]); R = rfun(5,M*0.15); % 生成圆 x = round(C(2) + R*cos(theta)); y = round(C(1) + R*sin(theta)); % 剔除位置小于0的点 loc = find((x>0) & (y>0)); [m,n] = size(JZ); nx = x(loc)-n; ny = y(loc)-m; % 剔除位置超出范围的点 nloc = find((nx<0) & (ny<0)); % 组合坐标 L = [ny(nloc)+m, nx(nloc)+n]; L = unique(L,rows); % 将符合条件的位置赋值为true JZ(sub2ind(size(JZ),L(:,2),L(:,1))) = true;
最后,感谢您的阅读!
互动专区
言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。 该问题所涉及的知点并不多也不难,主要就是如何生成圆以及矩阵赋值操作。因为矩阵是离散数据集,因此对矩阵的大小要有一定的限制,比如在一个2✖2或5✖5的矩阵中生成随机圆显然是没有意义的。 巴山将按以下步骤来解决该问题: 首先,初始化一定大小元素值全为false的逻辑矩阵JZ,并定义一个取值为0到2π的角theta,定义角是因为圆的参数方程要用到。 其次,随机生成圆心和半径,当然都得在矩阵大小范围内,特别提醒,这里的圆心只能取整数值,因为矩阵索引值不能为小数。 最后,根据半径和圆心生成圆的位置坐标并取整,剔除超过矩阵大小范围的位置,将矩阵中对应位置设置为true即可 以下是main函数及子函数randCircle: main函数: 子函数randCircle: function [JZ,L] = randCircle(M) JZ = false(M,M); % 定义圆周角 theta = linspace(0,2*pi,round(M*2)); % 定义随机函数 rfun = @(a,b) a+(b-a)*rand; % 随机圆心和半径 C = round([rfun(1,M-1),rfun(1,M-1)]); R = rfun(5,M*0.15); % 生成圆 x = round(C(2) + R*cos(theta)); y = round(C(1) + R*sin(theta)); % 剔除位置小于0的点 loc = find((x>0) & (y>0)); [m,n] = size(JZ); nx = x(loc)-n; ny = y(loc)-m; % 剔除位置超出范围的点 nloc = find((nx<0) & (ny<0)); % 组合坐标 L = [ny(nloc)+m, nx(nloc)+n]; L = unique(L,rows); % 将符合条件的位置赋值为true JZ(sub2ind(size(JZ),L(:,2),L(:,1))) = true; 最后,感谢您的阅读! 互动专区下一篇:
Java学习笔记(反射+枚举类)