我正在Matlab上做一些网格的实验。以下是我所拥有的:
以下是我正在努力高效地创造的东西:
下面是我以一种非常低效的方式(我对Matlab矢量化不太了解,所以请原谅我的无知):
numVerts = size(verts, 2);
numFaces = size(faces, 2);
mem = sparse(numVerts, numFaces);
for i = 1:size(verts, 2)
mem(i,:) = any(faces == i);
end
下面是一些能够测试这段代码的数值数据:
verts = [0 0 1 1; 0 1 0 1; 0 0 0 0];
faces = [1 3; 2 2; 3 4];
矩阵的每一列都是顶点的坐标。例如,这里的4个顶点位于位置(0,0,0),(0,1,0),(1,0,0)和(1,1,0)。
面矩阵的每一列都是属于一个面的3个顶点的指数。例如,上面定义的网格的面是两个三角形,它们被定义为包含顶点(1,2,3)和(3,2,4)。
这将创建一个简单的网格,包含4个顶点和2个三角形。本例中的mem矩阵是:
mem = [1 0; 1 1; 1 1; 0 1]
例如,在这里,mem( 2 ,1) =1,这意味着面1包含顶点数2,任何关于我如何更有效地完成它的指针?
发布于 2015-09-09 01:35:58
这就是你要的!让我们理解为什么这应该更快(我还没有描述它,但我99.99%肯定它会更快)。
关于稀疏矩阵,您应该知道的一件事是:way首先计算值的位置,然后一次创建矩阵比填充矩阵要快。这是正确的,因为它们存储在内存中的方式。
因此,让我们这样做。在您的问题中,有一件好事:faces
实际上包含要填充mem
的元素的行索引!列很简单,只是3-1s,3-2s,3-3s,.3-numFaces
!我们可以使用repmat
轻松地构建这样的数组。因此,这就是代码:
numVerts = size(verts, 2);
numFaces = size(faces, 2);
jj= repmat(1:numFaces,[3,1]); % 3 vtx in each face
jj=jj(:)';
mem = sparse( faces(:),jj,1,numVerts,numFaces);
然而,如果您只是使用逻辑,使矩阵成为一个逻辑,并节省大量内存!
mem = sparse( faces(:),jj,true,numVerts,numFaces);
https://stackoverflow.com/questions/32472360
复制相似问题