如图设置一个网格大小为256*256的点阵;
vr为圆形面积占总面积的比例;
r为圆形半径;
k1为圆外数字;
k2为园内数字;
需要生成n个不重叠的圆形数字矩阵,且圆形面积服从正态分布。(可以自定义k1和k2数字大小)
最后将其输出为txt文件,且一个数字为一行。
我原来写的是下面这样,所有的圆形都是相同半径
function producestructure()
clc;
clear all;
nx=256;
ny=256;
p=zeros(nx,ny);
vr=0.04;
nxy=nx*ny;
hn=nxy*vr;
nh=11;
rr=((hn/nh)/pi)^0.5;
km=1;
kh=0.048; %圆内
distt=8;
nk=1;
bddis=10;
for n=1:1:10000
x0=floor(rr+bddis+ (nx-2*rr-2*bddis)*rand);
y0=floor(rr+bddis+ (ny-2*rr-2*bddis)*rand);
if(n==1)
hc(nk,1)=x0;
hc(nk,2)=y0;
end
tr=1;
if(n>1)
for i=1:1:nk
D=((x0-hc(i,1))^2+(y0-hc(i,2))^2)^0.5;
if(D<(2*rr+distt))
tr=0;
end
end
end
if(tr>0)
nk=nk+1;
hc(nk,1)=x0;
hc(nk,2)=y0;
disp([x0 y0])
end
if(nk==nh) break; end
end
if(nk==nh)
p=p+km;
for k=1:1:nh
for m=1:1:ny
for n=1:1:nx
D=((n-hc(k,1))^2+(m-hc(k,2))^2)^0.5;
if(D<rr)
p(m,n)=kh;
end
end
end
end
pcolor(p);
shading interp;
else
disp(['please change dis for more point']);
end
fn=fopen('k.txt','w');
for m=1:1:ny
for n=1:1:nx
fprintf(fn,'%f\n',p(m,n));
end
end
fclose(fn) ;
df=0.01*(diff(p,2,2)+diff(p,2,1));
size(df)
我在你的代码基础上修改后,运行结果如下:
clc;
clear all;
nx = 256;
ny = 256;
p = zeros(nx, ny);
vr = 0.04;
nxy = nx*ny;
hn = nxy*vr;
nh = 11;
rr = ((hn/nh)/pi)^0.5;
km = 1;
k2 = 0.1;
kh = 0.048; % 圆内数字
k1 = 0.01; % 圆外数字
distt = 8;
nk = 1;
bddis = 10;
% 生成正态分布的圆心坐标
mu = [nx/2, ny/2]; % 均值
sigma = [50, 50]; % 标准差
hc = zeros(nh, 2);
while nk <= nh
coord = round(normrnd(mu, sigma, 1, 2));
if all(coord > rr+bddis) && all(coord < [nx, ny]-rr-bddis)
tr = 1;
if nk > 1
for i = 1:1:nk-1
D = ((coord(1)-hc(i,1))^2 + (coord(2)-hc(i,2))^2)^0.5;
if D < (2*rr+distt)
tr = 0;
break
end
end
end
if tr > 0
hc(nk,:) = coord;
nk = nk+1;
end
end
end
for k = 1:nh
r = randi([10,20]); % 生成10~20之间的整数作为半径
for m = 1:ny
for n = 1:nx
D = ((n - hc(k,1))^2 + (m - hc(k,2))^2)^0.5;
if (D < r)
if (D > r - 2) % 设置圆周边缘的宽度
p(m,n) = k2*(1-cos(pi*(D-r+2)/4))^2; % 通过插值平滑圆周边缘
elseif (D > r)
p(m,n) = k1;
else
p(m,n) = k2;
end
end
end
end
end
p(p == 0) = k1; % 圆外数字为 k1
pcolor(p);
shading interp;
fn = fopen('k.txt', 'w');
for m = 1:1:ny
for n = 1:1:nx
fprintf(fn, '%g\n', p(m,n));
end
end
fclose(fn);
基于new BIng的修改:
你的代码有以下几个问题:
你没有定义n,而是用一个循环来尝试生成nh个圆形,但是如果循环次数超过10000,就会停止,可能导致没有生成足够的圆形。
你没有定义k1和k2,而是用km和kh代替,但是这两个变量的含义不清楚,也没有注释说明。
你没有检查圆形是否超出了网格的边界,可能导致部分圆形被截断。
你没有考虑到圆形面积服从正态分布的要求,而是用一个固定的半径rr来生成所有的圆形。
function producestructure()
clc;
clear all;
nx=256; % 网格大小
ny=256;
p=zeros(nx,ny); % 初始化网格
vr=0.04; % 圆形面积占总面积的比例
nxy=nx*ny; % 总面积
hn=nxy*vr; % 圆形总面积
n=11; % 圆形个数
r_mean=sqrt(hn/n/pi); % 圆形平均半径
r_std=r_mean/10; % 圆形标准差
k1=1; % 圆外数字
k2=0.048; % 园内数字
distt=8; % 圆之间的最小距离
bddis=10; % 圆距离边界的最小距离
hc=zeros(n,2); % 存储圆心坐标
p=p+k1; % 填充圆外数字
for k=1:n
r = max(0, normrnd(r_mean,r_std)); % 根据正态分布生成随机半径
[x0,y0] = random_circle(nx,ny,r,distt,bddis,hc,k); % 生成随机圆心
if x0==-1 && y0==-1 % 如果没有找到合适的位置
disp(['无法生成第',num2str(k),'个圆,请调整参数']);
return;
end
hc(k,1)=x0; % 存储圆心坐标
hc(k,2)=y0;
for m=1:ny
for n=1:nx
D=((n-x0)^2+(m-y0)^2)^0.5; % 计算距离
if(D<r)
p(m,n)=k2; % 填充园内数字
end
end
end
end
pcolor(p); % 绘制图像
shading interp;
fn=fopen('k.txt','w'); % 打开文件
for m=1:ny
for n=1:nx
fprintf(fn,'%f\n',p(m,n)); % 写入文件
end
end
fclose(fn) ; % 关闭文件
df=0.01*(diff(p,2,2)+diff(p,2,1)); % 计算差分
size(df) % 显示差分的大小
```python
import numpy as np
# 网格大小
n_rows = 256
n_cols = 256
# 圆形面积占总面积的比例
vr = 0.1
# 正态分布的半径
radii = np.random.normal(loc=50, scale=10, size=1000)
# 圆外数字
k1 = 0
# 圆内数字
k2 = 1
# 生成n个不重叠的圆形数字矩阵
def generate_circles(radii, n, n_rows, n_cols, k1, k2):
circles = np.zeros((n_rows, n_cols))
for i in range(n):
x = np.random.randint(radii[i], n_cols - radii[i])
y = np.random.randint(radii[i], n_rows - radii[i])
circle = np.zeros((n_rows, n_cols))
for j in range(n_rows):
for k in range(n_cols):
if (j - y) ** 2 + (k - x) ** 2 <= radii[i] ** 2:
circle[j, k] = k2
else:
circle[j, k] = k1
circles += circle
return circles
# 生成数字矩阵并写入txt文件
def generate_matrix(filename):
circles = generate_circles(radii, 100, n_rows, n_cols, k1, k2)
with open(filename, 'w') as f:
for i in range(n_rows):
for j in range(n_cols):
f.write(str(int(circles[i, j])) + '\n')
# 测试
generate_matrix('matrix.txt')
```
以上代码将生成一个256*256的数字矩阵,其中包含100个不重叠的圆形,每个圆形的半径服从正态分布。每个圆形内的数字为k2,圆形外的数字为k1。最终的数字矩阵将写入名为matrix.txt的txt文件中,其中每行为一个数字。
朋友您好,以下是我把您的问题和相关观点都看了一遍分析出来的,望采纳谢谢啦
这个错误提示意味着在您的代码中,变量或函数 random_circle 被调用时未被定义或声明。这可能是因为该变量或函数名的拼写有误、该变量或函数在文件中的位置不正确、或者该变量或函数未在程序中定义。
要解决此错误,您可以尝试以下几种方法:
检查变量或函数名称的拼写:检查您使用的变量名或函数名是否与其在程序中定义的名称匹配。如果有拼写错误,则可纠正该错误。
声明变量或函数:如果变量或函数未在程序中定义,则需要在程序中声明它们。您可以在程序中添加一个变量声明语句,例如 var random_circle; 或添加一个函数声明语句,例如 function random_circle() {...}。
确保变量或函数在正确的位置:如果变量或函数已经定义了,但仍然遇到此错误,则很可能是因为它们不在程序的正确位置。请确保变量或函数在程序的范围内定义(如在全局范围内定义)或在程序中正确的位置定义(如在函数内部定义)。
不知道你这个问题是否已经解决, 如果还没有解决的话: