我写了一段代码,用于在Matlab上生成指定域内随机数的杆数,然后将输出保存在文本文件中。我想寻求帮助,在代码中添加以下选项;(i)如果随机生成的杆超过指定的域大小,则应该缩短该杆的长度,以便将其保持在特定的域中。(ii)我希望避免新生成的编号( rod )与前一个编号(Rod)重叠,如果重叠,请为新的rod生成另一个位置。
我想不出我该怎么做。如果有人能帮我写这两个选项的代码,那会有很大帮助。谢谢
% myrandom.m
% Units are mm.
% domain size
bx = 160;
by = 40;
bz = 40;
lf = 12; % rod length
nf = 500; % Number of rods
rns = rand(nf,3); % Start
rne = rand(nf,3)-0.5; % End
% Start Points
for i = 1:nf
rns(i,1) = rns(i,1)*bx;
rns(i,2) = rns(i,2)*by;
rns(i,3) = rns(i,3)*bz;
end
% Unit Deltas
delta = zeros(nf,1);
for i = 1:nf
temp = rne(i,:);
delta(i) = norm(temp);
end
% Length Deltas
rne = lf*rne./delta;
% End Points
rne = rns + rne;
fileID = fopen('scfibers.txt','w');
for i = 1:nf
fprintf(fileID,'%12.8f %12.8f %12.8f\r\n',rns(i,1),rns(i,2),rns(i,3));
fprintf(fileID,'%12.8f %12.8f %12.8f\r\n\r\n',rne(i,1),rne(i,2),rne(i,3));
end
fclose(fileID);
发布于 2018-12-17 07:10:37
我将从编写一个创建随机棒的函数开始:
function [rns,rne] = myrandom(domain,len,N)
rns = rand(N,3).*domain; % Start --> rns = bsxfun(@times,rand(N,3),domain)
rne = rand(N,3)-0.5; % End
% Unit Deltas
delta = zeros(N,1);
for k = 1:N
delta(k) = norm(rne(k,:));
end
% Length Deltas
rne = len*rne./delta; % --> rne = len*bsxfun(@rdivide,rne,delta)
% End Points
rne = rns + rne;
% remove rods the exceed the domain:
notValid = any(rne>domain,2); % --> notValid = any(bsxfun(@gt,rne,domain),2);
rns(notValid,:)=[];
rne(notValid,:)=[];
end
此函数以[bx by bz]
形式获取domain
,以len
形式获取杆件长度,并以N
形式获取要生成的杆件数量。请注意,使用逐元素乘法(.*
),我已经消除了第一个for
循环。
如果您使用的是2016b之前的MATLAB版本,则需要使用bsxfun
:
在MATLAB®R2016b及更高版本中,此表中列出的内置二进制函数独立支持隐式扩展。
受影响的行在代码中用-->
标记(使用备用方法)。
函数的最后三行从结果中删除所有超过域大小的rodes (我希望我在这一点上得到了正确的理解)。
接下来,我在脚本中调用此函数:
% domain size
bx = 160;
by = 40;
bz = 40;
domain = [bx by bz];
lf = 12; % rod length
nf = 500; % Number of rods
[rns,rne] = myrandom(domain,lf,nf);
u = unique([rns rne],'rows');
remain = nf-size(u,1);
while remain>0
[rns_temp,rne_temp] = myrandom(domain,lf,remain);
rns = [rns;rns_temp];
rne = [rne;rne_temp];
u = unique([rns rne],'rows');
remain = nf-size(u,1);
end
在基本定义之后,调用该函数并返回rne
和rns
,这两个值可能小于nf
。然后我们检查重复项,并将所有唯一的棒存储在u
中。我们计算剩余的杆数,并根据需要使用while
循环生成新的杆数。在循环的每一次迭代中,我们将新创建的rods添加到rne
和rns
中的rods中,并检查我们现在有多少个唯一的向量,如果有足够的向量,我们将退出循环(然后您可以向文件添加打印)。
请注意:
nf
棒,其中nf
是独一无二的(上面的代码做了什么)?或者你想去掉重复的东西,只保留nf
唯一的棒?在后一种情况下,我会将unique
函数部分插入到创建rods wile循环的函数中,因为上面所写的循环效率不高,因为没有进行内存预分配。我不确定这是否可能,如果你只是想创建更多的杆,但保留副本,但如果不是(第二个选项在上面的1),如果你要使用这个分配,那么预分配是非常recommended.https://stackoverflow.com/questions/53805280
复制相似问题