numnum metgrid levels与numnum metgrid levels有什么区别

四叉树归并构成VORONOI图的算法 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&四叉树归并构成VORONOI图的算法&&&  本算法的思想是,利用均匀网格(本文采用的网格数目为最接近点数的4的倍数),把所有点分入网格中,这些格网中的点构成VORONOI图,采用联机增量算法。然后利用分治算法中的区域合并方法,把所有的小方格所构成的VORONOI图组合起来成为完整的VORONOI图。  伪代码如下:  #ifnotdef voronoi.h  #def voronoi.h  //这里有三个类:point,voronoi,grid。point类用坐标来描述点的位置,voronoi则是平面点所构成的VORONOI图形,而grid是把point分布入其中的那些格网。  class point{  
struct position{      }          }  class voronoi{  
struct graph{  
CDC Polygon();  
struct onlineincremeth{  }  }  class grid{  
int num.range;  
int serial;  
int totalnum;  
int pointnum;  
int pointtotalnum;  
int layer;  
int morton.availabledigit;  
int morton.  ①使用均匀格网分割构成VORONOI图的算法。  Pref 建立最接近现有点数目,以四的倍数为格子数的均匀格网。以四叉树格式存储格网。  Post 输出点所构成的VORONOI图。  Return Null  1 open file
//打开点坐标的存储文件  2 read point.position //读点坐标  3 find_nearestquadronum(poin.totalnum,grid.num);//找到最接近点子总数的4的幂,以此数目作为栅格总数   4 create_grid(grid.num)//创建格网
  4 loop(point.seq not exceed poin.totalnum)
//依据坐标划分点进入格网  1find point.position in grid.num.range  2 point.gridnum=grid.serial  4 endloop  5 loop(grid.serial not exceed grid.stotalnum)
//把格网中的点合并成为VORONOI图  
1 loop(grid.pointnum not exceed grid.pointtotalnum)//对所在格网内的点数进行判断  
1 If grid.pointnum&=1//如果点数不大于1,跳出循环  
2 Break  
3 else  4 voronoi_onlineincremeth(point.gridnum = grid.serial)  5 voronoi.gridnum=grid.serial  4 end loop  6 end loop  7 conjoin_voronoi_quartreemeth(voronoi.grid)//采用四叉树网格合并算法  ②Conjoin_voronoi_quartreemeth:  Pref 我们首先需要把所有的小格网采用四叉数存储(存储的格式采用四进制的Morton码)  Post 通过把小的格网不断的归并起来,最终构成完整的VORONOI图。  Return VORONOI图  1 grid.layer=getlog(4,grid.num)//求网格的MORTON码的长度  2 loop(grid.layer not less than 1)//利用MORTON码长度进行VORONOI图合并  
1 grid.morton.availabledigit= getlog(4,grid.num)-grid.layer+1.//找到栅格的MORTON码的有效末位  2 loop(grid.morton.availabledigit not less than 1) //设置阀值使得栅格的可用MORTON码有效位数不少于1  1 grid.morton.lastdigit=0//栅格MORTON码的最后一位的起始搜索值为0  1 loop(grid.morton.lastdigit not exceed 3)//进行循环来查找位于同一大四叉树网格内的小网格  1 grid1.morton.lastdigit=get(grid1.morton.lastdigit++)  2 grid2.morton.lastdigit=grid1.morton.lastdigit  
1 if TRUE= compare (grid1.morton.lastdigit,grid2.morton.lastdigit)  
1 voronoi.graph=conjoin_voronoi(grid1,grid2)
//采用分治法中的VORONOI合并算法  
2 end if  
2 End loop  3 End loop   3 End loop  下面我们来分析算法的时间复杂度:   在第一部分的算法中,找出最接近点总数的格网数并创建格网需要花费常数时间,把所有点分入各个格网需要O(n)时间。对于下面部分的时间复杂度不一。最差情况就是O(n2)。   在第二部分算法中,第一步的操作中耗费的时间为O(log4n),后面合并VORONOI图的操作时间复杂度为O[log4n&(log4n+n2)],所以时间复杂度为O[log4n(n2)]。  综上所述,本算法的时间复杂度为O[n+n2+log4n(n2)]=O[log4n(n2)]。   看起来本算法时间耗费好像比较长,其实不一定,经过仔细研究。本算法对于均匀分布的点子算法时间耗费甚至可以降到O(log43n)。以16个点为例,O(log4316)=8,低于16本身。所以此算法适于均匀分布格网点。&&&&&今日推荐
&&&&&先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修... under pass
自由人非常擅长传球和垫球。
The libero is very go...美女学霸贝微微,立志成为游戏工程师,化名“芦苇微微”跻身网游高手,因拒绝上传真实照片而惨遭侠侣“真水无香”无情抛弃,却意外得到江湖第一高手信肖奈的垂青。为了赢得...目前,研究人员最新设计一款现实版“牵引波束”,可在太空中使用光线捕获物体。
物理学家指出,这种牵引波束可以使用光束捕获和推动物体,移动1厘米的距离。如果未来升...·&·&·&&&&&&本算法的思想是,利用均匀网格(本文采用的网格数目为最接近点数的4的倍数),把所有点分入网格中,这些格网中的点构成VORONOI图,采用联机增量算法。然后利用分治算法中的区域合并方法,把所有的小方格所构成的VORONOI图组合起来成为完整的VORONOI图。
伪代码如下:
#ifnotdef voronoi.h
#def voronoi.h
//这里有三个类:point,voronoi,grid。point类用坐标来描述点的位置,voronoi则是平面点所构成的VORONOI图形,而grid是把point分布入其中的那些格网。
class point{
struct position{
class voronoi{
struct graph{
CDC Polygon();
struct onlineincremeth{
class grid{
int num.range;
int serial;
int totalnum;
int pointnum;
int pointtotalnum;
int layer;
int morton.availabledigit;
int morton.
①使用均匀格网分割构成VORONOI图的算法。
Pref 建立最接近现有点数目,以四的倍数为格子数的均匀格网。以四叉树格式存储格网。
Post 输出点所构成的VORONOI图。
Return Null
1 open file
//打开点坐标的存储文件
2 read point.position //读点坐标
3 find_nearestquadronum(poin.totalnum,grid.num);//找到最接近点子总数的4的幂,以此数目作为栅格总数
4 create_grid(grid.num)//创建格网
4 loop(point.seq not exceed poin.totalnum)
//依据坐标划分点进入格网
1find point.position in grid.num.range
2 point.gridnum=grid.serial
5 loop(grid.serial not exceed grid.stotalnum)
//把格网中的点合并成为VORONOI图
1 loop(grid.pointnum not exceed grid.pointtotalnum)//对所在格网内的点数进行判断
1 If grid.pointnum&=1//如果点数不大于1,跳出循环
4 voronoi_onlineincremeth(point.gridnum = grid.serial)
5 voronoi.gridnum=grid.serial
4 end loop
6 end loop
7 conjoin_voronoi_quartreemeth(voronoi.grid)//采用四叉树网格合并算法
②Conjoin_voronoi_quartreemeth:
Pref 我们首先需要把所有的小格网采用四叉数存储(存储的格式采用四进制的Morton码)
Post 通过把小的格网不断的归并起来,最终构成完整的VORONOI图。
Return VORONOI图
1 grid.layer=getlog(4,grid.num)//求网格的MORTON码的长度
2 loop(grid.layer not less than 1)//利用MORTON码长度进行VORONOI图合并
1 grid.morton.availabledigit= getlog(4,grid.num)-grid.layer+1.//找到栅格的MORTON码的有效末位
2 loop(grid.morton.availabledigit not less than 1) //设置阀值使得栅格的可用MORTON码有效位数不少于1
1 grid.morton.lastdigit=0//栅格MORTON码的最后一位的起始搜索值为0
1 loop(grid.morton.lastdigit not exceed 3)//进行循环来查找位于同一大四叉树网格内的小网格
1 grid1.morton.lastdigit=get(grid1.morton.lastdigit++)
2 grid2.morton.lastdigit=grid1.morton.lastdigit
1 if TRUE= compare (grid1.morton.lastdigit,grid2.morton.lastdigit)
1 voronoi.graph=conjoin_voronoi(grid1,grid2)
//采用分治法中的VORONOI合并算法
2 End loop
3 End loop
3 End loop
下面我们来分析算法的时间复杂度:
在第一部分的算法中,找出最接近点总数的格网数并创建格网需要花费常数时间,把所有点分入各个格网需要O(n)时间。对于下面部分的时间复杂度不一。最差情况就是O(n2)。
在第二部分算法中,第一步的操作中耗费的时间为O(log4n),后面合并VORONOI图的操作时间复杂度为O[log4n&(log4n+n2)],所以时间复杂度为O[log4n(n2)]。
综上所述,本算法的时间复杂度为O[n+n2+log4n(n2)]=O[log4n(n2)]。
看起来本算法时间耗费好像比较长,其实不一定,经过仔细研究。本算法对于均匀分布的点子算法时间耗费甚至可以降到O(log43n)。以16个点为例,O(log4316)=8,低于16本身。所以此算法适于均匀分布格网点。&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&请问ng-grid和ui-grid有什么区别?哪个好?
请问ng-grid和ui-grid有什么区别?哪个好?
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2CUDA __shared__ thread、block、grid之间的一维关系 (例子chapter5 dot点积(GPU高性能编程)... - 推酷
CUDA __shared__ thread、block、grid之间的一维关系 (例子chapter5 dot点积(GPU高性能编程)...
#include &iostream&
#include &cuda_runtime.h&
#include &device_launch_parameters.h&
#include &book.h&
#include &cpu_bitmap.h&
//1.minFun
对于每个Grid而言,选取block数比较少的,这样可以减少每个grid中最后一个block内thread的冗余。
int imin(int a,int b)
const int N = 33*1;//整体线程的数量,即向量(a)*(b)中每个向量数组的大小
const int ThreadNumsPerBlock =256;//每个block中thread的数量
const int BlockNumsPerGrid = imin(32,(N+ThreadNumsPerBlock-1)/ThreadNumsPerBlock);//每个grid中block的数量,
__global__ void dot(float* a,float* b,float* c)//输入两个向量:a,b ;结果c大小为一个grid内block的大小,grid内每个block的位置对应数组c每个下标对应的数据。
int everyThreadIndex
threadIdx.x+blockIdx.x*blockDim.x;//获取一个grid中thread的index
cacheIndex = threadIdx.x;//获取一个block中thread的index
__shared__ float cache[ThreadNumsPerBlock];
float temp = 0;
while(everyThreadIndex&N)//多个grid的跳跃index,
temp += a[everyThreadIndex]*b[everyThreadIndex];
everyThreadIndex += blockDim.x*gridDim.x;//
cache[cacheIndex] =//得到多个grid中 一个block里相应的一个thread的乘积的和
__syncthreads();
int i= blockDim.x/2;
while(i!=0)
if(cacheIndex&i)
cache[cacheIndex]= cache[cacheIndex]+cache[cacheIndex+i];//while里的这句是在block里不同的thread里执行的
__syncthreads();
i=i/2;//当每个thread都执行后,才能进行长度折半
if(0==cacheIndex)
c[blockIdx.x] = cache[0];
int main(void)//
*host_a,*host_b,*host_c;
*device_a,*device_b,*device_c;
host_a = (float*)malloc(N*sizeof(float));
host_b = (float*)malloc(N*sizeof(float));
host_c = (float*)malloc(BlockNumsPerGrid*sizeof(float));
for (int i=0; i&N; i++) {
host_a[i] =
host_b[i] = i*2;
//gpu上分配内存
cudaMalloc((void**)&device_a,N*sizeof(float));
cudaMalloc((void**)&device_b,N*sizeof(float));
cudaMalloc((void**)&device_c,BlockNumsPerGrid*sizeof(float));
cudaMemcpy(device_a,host_a,N*sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy(device_b,host_b,N*sizeof(float),cudaMemcpyHostToDevice);
dot&&&BlockNumsPerGrid,ThreadNumsPerBlock&&&(device_a,device_b,device_c);
cudaMemcpy(host_c,device_c,BlockNumsPerGrid*sizeof(float),cudaMemcpyDeviceToHost);
float c=0;
for(int i=0;i&BlockNumsPerGi++)
c = c + host_c[i];
#define sum_squares(x)
(x*(x+1)*(2*x+1)/6)
std::cout&&&结果1:&&&c&&&结果2:&&&2 * sum_squares( (float)(N - 1) )&&std::
cudaFree(device_a);
cudaFree(device_b);
cudaFree(device_c);
free(host_a);
free(host_b);
free(host_c);
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 numlock是什么键 的文章

 

随机推荐