如何在matlab中找到具有n个公共元素的大行矩阵的行索引?
How to find row indices of large row matrix with n common elements in matlab?
我正在尝试查找索引具有 2 个公共元素的矩阵的行对。我有一个 3D 对象的三角剖分,想通过相邻三角形的角度过滤三角形。所以,我必须找到共享一条边的三角形。为此,我必须找到 .tri 文件中具有 2 个公共点的行。
我有 350 个左右的 .tri 文件,每个文件的亮度约为 7000x3。我找到了这个资源:
MathWorks link
接受的答案需要我 mac 播放 15 分钟,而 Matt Figs 的答案每个 .tri 文件大约需要 8 分钟(我有 350!)。
我怎样才能完成这个过程?有人告诉我尝试用 C 编写这部分代码(我从未使用过 C)。我也考虑过尝试在 linux 服务器上安装 Matlab 并在那里 运行 安装它(我也从未这样做过)。关于如何用 C 编写程序或使用 AWS 服务器有什么建议吗?
3D 文件位于此处:3D files
这是我 运行 的代码:
(任何清理它的建议也将不胜感激)
addpath('/Users/len/Desktop/javaplex/nonrigid3d')
files1 = dir('/Users/len/Desktop/javaplex/nonrigid3d/*.tri');
files2 = dir('/Users/len/Desktop/javaplex/nonrigid3d/*.vert');
time=cputime;
for k =1:length(files1)
X=load(files1(k).name);
Pt=load(files2(k).name);
%define a sparse matrix for holding angles between 2-simplices
W=sparse(length(X),length(X));
% Find common vertices: try with C
Xs = sort(X,2);
S = size(X,1);
L = S*(S+1)/2;
F = sparse(L,L);
cnt = 0;
Ntoshare = 2;
for ii = 1:S
for jj = ii+1:S
cnt = cnt + 1;
if sum(ismembc(Xs(ii,:),Xs(jj,:)))==Ntoshare
F(jj,ii) = 1;
end
end
end
[I,J] = find(F); % pairs of rows that have 2 common vertices.
cmn=[I,J];
% Calculate angle and store in sparse matrix. row and col reference triangles
for i=1:length(cmn)
normal1=cross(Pt(X(cmn(i,1),1),:)-Pt(X(cmn(i,1),2),:) ,Pt(X(cmn(i,1),1),:)-Pt(X(cmn(i,1),3),:));
normal2=cross(Pt(X(cmn(i,2),1),:)-Pt(X(cmn(i,2),2),:), Pt(X(cmn(i,2),1),:)-Pt(X(cmn(i,2),3),:));
theta = acos((dot(normal1,normal2)/(norm(normal1)*norm(normal2))));
W(cmn(i,1),cmn(i,2))=theta;
end
% save W as a txt file as nameofimage.txt in current directory
[i,j,val]=find(W);
data_dump=[i,j,val];
l=files1(k).name;
filename = strrep(l, '.tri','.txt');
dlmwrite(filename, data_dump, 'delimiter',' ');
已经有很多内置方法可以对三角形网格进行计算。看看 triangulation
class。
以下几行将像您的代码一样计算非边界三角形之间的角度。
%%// Generate triangulation data structure
Tri = triangulation(X, Pt);
%%// Find neighboring triangles
edgeAttachments = Tri.edgeAttachments(Tri.edges);
neighbors = cell2mat(edgeAttachments(cellfun(@numel, edgeAttachments)==2));
%%// Compute angles
normals1 = Tri.faceNormal(neighbors(:,1));
normals2 = Tri.faceNormal(neighbors(:,2));
angles = acos(dot(normals1, normals2, 2)); %// faceNormals are already normalized
%%// Generate the output you are looking for
data_dump = [neighbors, angles];
我正在尝试查找索引具有 2 个公共元素的矩阵的行对。我有一个 3D 对象的三角剖分,想通过相邻三角形的角度过滤三角形。所以,我必须找到共享一条边的三角形。为此,我必须找到 .tri 文件中具有 2 个公共点的行。
我有 350 个左右的 .tri 文件,每个文件的亮度约为 7000x3。我找到了这个资源: MathWorks link 接受的答案需要我 mac 播放 15 分钟,而 Matt Figs 的答案每个 .tri 文件大约需要 8 分钟(我有 350!)。
我怎样才能完成这个过程?有人告诉我尝试用 C 编写这部分代码(我从未使用过 C)。我也考虑过尝试在 linux 服务器上安装 Matlab 并在那里 运行 安装它(我也从未这样做过)。关于如何用 C 编写程序或使用 AWS 服务器有什么建议吗?
3D 文件位于此处:3D files 这是我 运行 的代码: (任何清理它的建议也将不胜感激)
addpath('/Users/len/Desktop/javaplex/nonrigid3d')
files1 = dir('/Users/len/Desktop/javaplex/nonrigid3d/*.tri');
files2 = dir('/Users/len/Desktop/javaplex/nonrigid3d/*.vert');
time=cputime;
for k =1:length(files1)
X=load(files1(k).name);
Pt=load(files2(k).name);
%define a sparse matrix for holding angles between 2-simplices
W=sparse(length(X),length(X));
% Find common vertices: try with C
Xs = sort(X,2);
S = size(X,1);
L = S*(S+1)/2;
F = sparse(L,L);
cnt = 0;
Ntoshare = 2;
for ii = 1:S
for jj = ii+1:S
cnt = cnt + 1;
if sum(ismembc(Xs(ii,:),Xs(jj,:)))==Ntoshare
F(jj,ii) = 1;
end
end
end
[I,J] = find(F); % pairs of rows that have 2 common vertices.
cmn=[I,J];
% Calculate angle and store in sparse matrix. row and col reference triangles
for i=1:length(cmn)
normal1=cross(Pt(X(cmn(i,1),1),:)-Pt(X(cmn(i,1),2),:) ,Pt(X(cmn(i,1),1),:)-Pt(X(cmn(i,1),3),:));
normal2=cross(Pt(X(cmn(i,2),1),:)-Pt(X(cmn(i,2),2),:), Pt(X(cmn(i,2),1),:)-Pt(X(cmn(i,2),3),:));
theta = acos((dot(normal1,normal2)/(norm(normal1)*norm(normal2))));
W(cmn(i,1),cmn(i,2))=theta;
end
% save W as a txt file as nameofimage.txt in current directory
[i,j,val]=find(W);
data_dump=[i,j,val];
l=files1(k).name;
filename = strrep(l, '.tri','.txt');
dlmwrite(filename, data_dump, 'delimiter',' ');
已经有很多内置方法可以对三角形网格进行计算。看看 triangulation
class。
以下几行将像您的代码一样计算非边界三角形之间的角度。
%%// Generate triangulation data structure
Tri = triangulation(X, Pt);
%%// Find neighboring triangles
edgeAttachments = Tri.edgeAttachments(Tri.edges);
neighbors = cell2mat(edgeAttachments(cellfun(@numel, edgeAttachments)==2));
%%// Compute angles
normals1 = Tri.faceNormal(neighbors(:,1));
normals2 = Tri.faceNormal(neighbors(:,2));
angles = acos(dot(normals1, normals2, 2)); %// faceNormals are already normalized
%%// Generate the output you are looking for
data_dump = [neighbors, angles];