首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab生成随机数和重叠检查

Matlab生成随机数和重叠检查
EN

Stack Overflow用户
提问于 2018-12-17 02:34:23
回答 1查看 83关注 0票数 2

我写了一段代码,用于在Matlab上生成指定域内随机数的杆数,然后将输出保存在文本文件中。我想寻求帮助,在代码中添加以下选项;(i)如果随机生成的杆超过指定的域大小,则应该缩短该杆的长度,以便将其保持在特定的域中。(ii)我希望避免新生成的编号( rod )与前一个编号(Rod)重叠,如果重叠,请为新的rod生成另一个位置。

我想不出我该怎么做。如果有人能帮我写这两个选项的代码,那会有很大帮助。谢谢

代码语言:javascript
运行
复制
% 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);
EN

Stack Overflow用户

发布于 2018-12-17 07:10:37

我将从编写一个创建随机棒的函数开始:

代码语言:javascript
运行
复制
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 (我希望我在这一点上得到了正确的理解)。

接下来,我在脚本中调用此函数:

代码语言:javascript
运行
复制
% 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

在基本定义之后,调用该函数并返回rnerns,这两个值可能小于nf。然后我们检查重复项,并将所有唯一的棒存储在u中。我们计算剩余的杆数,并根据需要使用while循环生成新的杆数。在循环的每一次迭代中,我们将新创建的rods添加到rnerns中的rods中,并检查我们现在有多少个唯一的向量,如果有足够的向量,我们将退出循环(然后您可以向文件添加打印)。

请注意:

  1. 我不确定你所说的“在重叠的情况下为新的棒生成另一个地方”是什么意思-如果一些是重复的,那么你想拥有更多的nf棒,其中nf是独一无二的(上面的代码做了什么)?或者你想去掉重复的东西,只保留nf唯一的棒?在后一种情况下,我会将unique函数部分插入到创建rods wile循环的函数中,因为上面所写的循环效率不高,因为没有进行内存预分配。我不确定这是否可能,如果你只是想创建更多的杆,但保留副本,但如果不是(第二个选项在上面的1),如果你要使用这个分配,那么预分配是非常recommended.
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53805280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档