-
matlab生成一个三角形平面的法向量
2013-10-31 16:19:42%求三角形法向量 function [x,y,z]=fa_vector(nodes,x1,x2,x3) %三个点的坐标 p1=[nodes(x1,2),nodes(x1,3),nodes(x1,4)]; p2=[nodes(x2,2),nodes(x2,3),nodes(x1,4)]; p3=[nodes(x3,2),nodes(x3,3),nodes(x3,4)]; %...%求三角形法向量 function [x,y,z]=fa_vector(nodes,x1,x2,x3) %三个点的坐标 p1=[nodes(x1,2),nodes(x1,3),nodes(x1,4)]; p2=[nodes(x2,2),nodes(x2,3),nodes(x1,4)]; p3=[nodes(x3,2),nodes(x3,3),nodes(x3,4)]; %两个边向量 a=p2-p1; b=p3-p1; %求法向量 c=cross(b,a); %归一化 norm = sqrt(c(1,1)^2+c(1,2)^2+c(1,3)^2); x=c(1,1)/norm; y=c(1,2)/norm; z=c(1,3)/norm; end
-
matlab练习程序(点云表面法向量)
2020-03-29 18:45:022.用最小二乘估计当前邻域点组成的平面,得到法向量。 3.根据当前邻域点平均值确定邻域质心,通常质心会在弯曲表面的内部,反方向即为法线方向。 vlfeat在这里下载,配置参考这里,rabbit.pcd下载地址 处理效果...思路还是很容易想到的:
1.首先使用KD树寻找当前点邻域的N个点,这里取了10个,直接调用了vlfeat。
2.用最小二乘估计当前邻域点组成的平面,得到法向量。
3.根据当前邻域点平均值确定邻域质心,通常质心会在弯曲表面的内部,反方向即为法线方向。
vlfeat在这里下载,配置参考这里,rabbit.pcd下载地址
处理效果如下:
原始点云:
点云表面法向量,做了降采样处理:
兔子果断变刺猬。
matlab代码如下:
clear all; close all; clc; warning off; pc = pcread('rabbit.pcd'); pc=pcdownsample(pc,'random',0.3); %0.3倍降采样 pcshow(pc); pc_point = pc.Location'; %得到点云数据 kdtree = vl_kdtreebuild(pc_point); %使用vlfeat建立kdtree normE=[]; for i=1:length(pc_point) p_cur = pc_point(:,i); [index, distance] = vl_kdtreequery(kdtree, pc_point, p_cur, 'NumNeighbors', 10); %寻找当前点最近的10个点 p_neighbour = pc_point(:,index)'; p_cent = mean(p_neighbour); %得到局部点云平均值,便于计算法向量长度和方向 %最小二乘估计平面 X=p_neighbour(:,1); Y=p_neighbour(:,2); Z=p_neighbour(:,3); XX=[X Y ones(length(index),1)]; YY=Z; %得到平面法向量 C=(XX'*XX)\XX'*YY; %局部平面指向局部质心的向量 dir1 = p_cent-p_cur'; %局部平面法向量 dir2=[C(1) C(2) -1]; %计算两个向量的夹角 ang = sum(dir1.*dir2) / (sqrt(dir1(1)^2 +dir2(1)^2) + sqrt(dir1(2)^2 +dir2(2)^2)+sqrt(dir1(3)^2 +dir2(3)^2) ); %根据夹角判断法向量正确的指向 flag = acos(ang); dis = norm(dir1); if flag<0 dis = -dis; end %画出当前点的表面法向量 t=(0:dis/100:dis)'; x = p_cur(1) + C(1)*t; y = p_cur(2) + C(2)*t; z = p_cur(3) + (-1)*t; normE =[normE;x y z]; i end pcshowpair(pc,pointCloud(normE));
-
手写PCA(主元分析法)计算点云法向量(详细注释) 【Matlab代码】
2020-01-07 23:22:03点云法向量与点云平面拟合的关系(PCA) Estimating Surface Normals in a PointCloud 3D【24】PCA点云法向量估计 利用PCA计算点云的法线 3D点云法向量估计(最小二乘拟合平面) 为什么用PCA做点云法线估计? ...原理
Estimating Surface Normals in a PointCloud
利用PCA求点云的法向量
pca_demo.m
clc clear close all n=50; z=peaks(n); x=1:n;y=1:n; [x,y]=meshgrid(x,y); P=[x(:),y(:),z(:)]; %读入屋顶点云 % P=load('building_Example2.txt'); % P=P(:,1:1:3); %读入Building1.txt % P=load('point_w.txt'); % P=P(:,1:1:3); P=P';%P=3x2500 k=8; [pn,pw] = pca(P, k); pp = P+3.*pn;%pn为法向量,pw为评价曲率的一个参数 %求取曲率最大的500个点 P_=P';%P_ 是2500x3 [pw_,indice]=sort(pw); indice=indice'; %找出曲率最大(或最小)的几个点,验证 % pw_first=indice(size(indice,1)-100:1:size(indice,1),:);%曲率最大值排前1000的点 pw_first=indice(1:1:700,:);%曲率最小值(最平坦)排前1000的点 for i=1:size(pw_first) Point_pw(i,1)=P_(pw_first(i),1); Point_pw(i,2)=P_(pw_first(i),2); Point_pw(i,3)=P_(pw_first(i),3);%Point_pw为曲率的前500个点 end figure; % scatter3( P(1,:)',P(2,:)',P(3,:)','.'); plot3(P(1,:)',P(2,:)',P(3,:)','g.'); hold on plot3(Point_pw(:,1),Point_pw(:,2),Point_pw(:,3),'r*'); title("最平坦的前780个点"); % 使用matlab工具箱计算的法向量 figure(2); P=P'; pt=pointCloud(P); pcshow(pt); hold on; normals=pcnormals(pt,8); u = normals(1:5:end,1); v = normals(1:5:end,2); w = normals(1:5:end,3); x=P(1:5:end,1); y=P(1:5:end,2); z=P(1:5:end,3); title('Matlab点云工具箱计算的 Normals of Point Cloud') hold on quiver3(x, y, z, u, v, w); view(-37.5,45); hold off %使用pca计算的法向量 figure(3) pcshow(pt); hold on; pn=pn';%对pn进行转置 u_p = pn(1:5:end,1); v_p = pn(1:5:end,2); w_p = pn(1:5:end,3); title('PCA计算的 Normals of Point Cloud') hold on quiver3(x, y, z, u_p, v_p, w_p); view(-37.5,45); hold off
pca.m
% PCA主元分析法求法向量 % 输入: % p:3*n的数值矩阵 % k:k近邻参数 % neighbors = transpose(knnsearch(transpose(p), transpose(p), 'k', k+1)); % neighbors一般可缺省。若之前做过k邻域求取操作也可直接调用,提高运算效率 % 输出 % n:法矢,已规定方向由邻域拟合出的平面指向查询点 % w:用于评估曲率的参数,详见:Mark P,et al. Multi-scale Feature Extraction on Point-Sampled Surfaces[J]. Computer Graphics Forum, 2010, 22(3): 281-289. function [n,w] = pca(p, k, neighbors)%p为输入的点云 if nargin < 2 error('no bandwidth specified') end if nargin < 3 neighbors = transpose(knnsearch(transpose(p), transpose(p), 'k', k+1));%neighbor为一个索引矩阵,第一行代表第几个点,后8行代表K近邻的点。记录每个点及其周围的8个点 end m = size(p,2);%返回第2维的维度 n = zeros(3,m); %存放法线的矩阵 w = zeros(1,m); for i = 1:m x = p(:,neighbors(2:end, i));%x为8个邻域点 ,3x8的矩阵 p_bar=mean(x,2);%每一行求均值(一共三行) % P = (x - repmat(p_bar,1,k)) * transpose(x - repmat(p_bar,1,k));%中心化样本矩阵,再计算协方差矩阵 % P = 1/(k) * (x - repmat(p_bar,1,k)) * transpose(x - repmat(p_bar,1,k)); %邻域协方差矩阵P P=(x - repmat(p_bar,1,k)) * transpose(x - repmat(p_bar,1,k))./(size(x,2)-1); [V,D] = eig(P);%求P的特征值、特征向量。 D是对应的特征值对角矩阵,V是特征向量(因为协方差矩阵为实对称矩阵,故特征向量为单位正交向量) [d0, idx] = min(diag(D)); %d0为最小特征值 idx为特征值的列数索引。diag():创建对角矩阵或获取矩阵的对角元素 n(:,i) = V(:,idx); % 最小特征值对应的特征向量为法矢,即法向量 %规定法矢方向指向 flag = p(:,i) - p_bar;%由近邻点的平均点指向对应点的向量 if dot(n(:,i),flag)<0%如果这个向量与法向量的数量积为负数(反向) n(:,i)=-n(:,i);%法向量取反向 end if nargout > 1 w(1,i)=abs(d0)./sum(abs(diag(D)));%最小特征值的绝对值在协方差矩阵特征值绝对值的总和中占的比重 end end
效果
在pca.m中是用到了matlab内置的K-NN查找K近邻点
近邻点查找效果如下,这里K取8,
使用手写的PCA计算出的法向量和matlab点云处理工具箱计算的法向量的效果对比如下,
可以看到,基本上是一样的。
-
matlab pca求曲率和法向量_从优化的角度看PCA降维的原理
2020-11-28 12:29:32参考周志华老师的西瓜书,对PCA的求解...这里这个超平面应该有两个性质:I.最近重构性:重构后的样本映射回原空间,与原样本的距离都足够的近;II.最大可分性:样本在这个超平面上的投影尽可能分开。本文主要基于这...参考周志华老师的西瓜书,对PCA的求解构成进行细节的推导,希望能有所帮助。
主成分分析简称PCA,是一种在尽可能减少信息损失的情况下找到某种方式降低数据的维度的方法。对于正交属性空间中的样本点,如何用一个超平面对所有样本进行恰当的表达?这里这个超平面应该有两个性质:
I.最近重构性:重构后的样本映射回原空间,与原样本的距离都足够的近;
II.最大可分性:样本在这个超平面上的投影尽可能分开。本文主要基于这个两个性质,从PCA的公式推导的角度,来看优化在其中的作用。
一、最近重构性
设在n维空间中有m个样本点矩阵X:
现在对这些点进行压缩,使其投影到k维空间中,其中k<n,使其损失的信息最小。假设数据样本进行了去中心化,即
, 再假定矩阵
,是投影变换后的得到的新坐标系, 是投影矩阵,其中
是标准的正交基向量,即满足:
若丢弃新坐标系中的部分坐标,即将维度降低到k<n。
由矩阵的乘法可知,将样本点
低维空间的坐标为
,其中
, j<=k。
所以,利用该坐标系重构数据,即把数据集合Z从k维空间重新映射回n维空间,得到新的坐标点
这里假设新得到的数据与原始的数据点之间的距离最小,即PCA可转化为求解约束最优化问题:
1.1
根据F范数与矩阵迹的关系:
1.2
利用1.2对1.1进行简化:
1.3
由于已知项,不会影响到最优化的结果;有负号转为最大值,所以1.4等式简化为:
1.4
1.4式变换为:
1.5
最终PCA的最优化问题就简化为:
1.6
利用拉个朗日乘子法来求解1.6的最优化问题,引入乘子矩阵
,若此时仅考虑约束
,则拉格朗日乘子矩阵
此时为对角矩阵 , 另新的拉格朗日乘子矩阵为
,1.6式转化为求解拉格朗日函数的极值:1.7
对1.7式求W的偏导数,在导数为0处取极值:
由矩阵微分公式
:
1.8
从1.8式根据特征向量的定义可知,
分别表示由协方差矩阵
的特征值和特征向量,特征值越大,数据在其对应额特征向量的方向上所包含的信息越丰富。
显然,此时只需要令
和
分别为 协方差
的前
个最大的特征值和单位特征向量就能使得目标函数达到最优值。
二、最大可分性
从最大可分性出发,能得到PCA的另一种解释。样本点
在新空间中超平面上的投影是
,若所有样本点的投影能尽可能分开,则应该使投影后样本点的方差最大化:
使所有的样本的投影尽可能的分开,则叙最大话投影点的方差 投影后样本点的方差是
,优化目标可以转化为矩阵的迹:
后面的求解构成与第一种的最近重构性一致。
PCA的算法步骤:
输入:n维空间的样本集合其中;映射到k维空间
1、归一化,将X中样本变换为标准正态分布:
1.1
1.2
2、计算协方差矩阵
3、对协方差矩阵进行特征分解
4、求取最大的k个特征值以及对应的特征向量,依次记录为
输出,其中三、PCA的应用
(一)、数据降维。数据降维是处理高维度数据的基础。使用PCA降维有什么意义?
- 数据在低维下更容易进行处理与使用,算法的开销也将大大减少,比如在研究高维度数据分群中,使用无监督聚类的距离公式计算相似度不准确且开销大;
- 相关特征,重要特征通过降维能在数据中显现出来;同时,降至2维或3维也能进行可视化;
- 去除数据噪声,当数据受到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃能再一定程度上起到去噪的作用。
将三维数据降至二维平面 (二)、人脸识别与手写数字识别。PCA在这方面的应用这几年随着深度学习技术的发展,而不断弱化。这里可以看下相关的blog文章,以人脸识别为例,计算人脸图像库中的“平均脸”并提取前K为特征向量,用于做映射矩阵。最终就是计算残差的大小,来判断人脸。残差公式就是上面的1.1式
PCA检测人脸的简单示例_matlab实现 - CSDN博客blog.csdn.net手写数字识别的例子没有找到,可以参考下PRML的截图:
南瓜书PumpkinBook_机器学习公式推导datawhalechina.github.io阿泽:【机器学习】降维——PCA(非常详细)zhuanlan.zhihu.com矩阵乘法的本质是什么?www.zhihu.com -
Matlab中向量点乘、点积、叉乘计算
2020-06-12 11:55:29点乘 点乘就是将向量的每个元素对应进行相乘的操作 ...叉乘就是计算两个向量的垂直向量,即找出两向量构成平面的法向量。其几何意义是计算两向量构成的平行四边形的面积。 语法:cross(x1,x2) 运行: ... -
matlab向量与x正方向的夹角_空间向量与立体几何教材分析及教学建议
2020-12-31 22:21:09点击蓝字 关注我们《空间向量与立体几何》教材分析及教学建议广州市铁一中学 易安一主要内容 ...空间向量运算的坐标表示3.2 立体几何中的向量方法:平面的法向量;空间线面关系的判定;空间角的计算;立体几何中的向... -
点云向量 旋转 罗德里格斯(Rodrigues)变换Matlab
2020-06-29 13:17:29已知点云的两个平面方程(即法向量),来进行点云的旋转平移变换,步骤如下: 1.通过法向量,来求旋转向量和旋转角 2.通过罗德里格斯(Rodrigues)法,将旋转向量变换为旋转矩阵,PS:旋转向量要满足:为单位向量,... -
基于MATLAB_Simulink平面连杆机构的动态仿真
2010-03-21 00:06:46目录 第1章 绪论 1.1 引言 1.2 矩阵、向量表示法定义 1.3 平面连杆机构的组成原理 1.4 动力学主要分析方法 1.5 神经网络 1.6 本书研究的主要内容第2章 平面连杆机构的运动学分析 2.1 引言 2.2 MATLAB位移与速度分析... -
Matlab:Fox_Li数值迭代法求激光器谐振腔本征模式
2020-03-15 21:44:02对于平行平面腔以及在激光器的不断发展过程中所涌现的许多新型结构谐振腔通常是没有解析结果的 ,必须采用各种数值模拟方法进行求解 ,如 Fox-Li 迭代法、快速傅立叶变换法(FFT)、等效透镜波导法、特征向量法 、有限元... -
matlab实现单纯型法解线性规划_线性规划问题中的多解现象
2020-11-21 07:21:47几何解释是目标向量垂直于那个最优超平面。出现多解问题的几种可能性:问题没有能够得到很好地定义,或者说问题定义得比较“松”,导致有多个解。如果约束恰当,那么可能会恰好消除掉多解。问题的系统非常健壮,天然... -
matlab开发-调整计划不正常
2019-08-27 15:07:06matlab开发-调整计划不正常。调整或多或少的平面点云,使其适合给定的法向量。 -
ML—感知机算法(MATLAB)
2015-06-19 22:27:25感知机算法属于比较简单的分类器算法,但是跟逻辑回归和支持向量机一样属于构建分类超平面。 不同的是感知机采用分错的样本与分类超平面的距离作为损失函数,下面的算法基于随机梯度下降法,采用异步方式达到... -
matlab命令手册pdf
2011-05-23 20:39:363.3 除法 40 3.4 转置和共轭 41 3.5 元素操作算术运算 42 3.6 元素操作函数 43 3.7 矩阵的乘方与函数 44 3.8 关系运算符 45 3.9 逻辑运算符 46 3.10 逻辑函数 47 第4章 创建新矩阵 50 4.1 建立新矩阵 50 4.2 空矩阵 ... -
数学建模 matlab图形绘制功能.ppt
2020-03-12 22:21:34matlab的图形绘制功能 赵瑞 一 二维图像 1离散数据和离散函数的可视化 一对实数(x,y)可以表示为平面上的一个点 一对实数向量x=[x1,x2,xn]T,y=[y1,y2,yn]T,可以表示平面上 的一组点MATLAB就是利用这种几何比拟法实现... -
线性支持向量分类机及其实现
2019-07-20 01:23:53本文讨论对于一般的分类问题,线性支持向量分类机(C-SVC)的实现原理及MATLAB代码实现。 由于需要处理线性不可分问题,我们没法找到一个超平面可以完全正确的分化训练集,因此需要“软化”一些条件。由标准的支持... -
已知空间圆弧曲线的两点以及圆心半径,用matlab画出圆弧
2019-09-25 10:11:37已知空间圆弧曲线的两点以及圆心半径,用matlab画出圆弧。 两点坐标:p1 = (p1(1),p1(2),p1(3));p2 = (p2(1),p2(2),p2(3));圆心坐标:c=(c(1),c(2),c(3)) 代码: ...%% 平面 法向量 p12 = p2 - p1; pc... -
运筹学整数规划matlab程序
2020-06-16 23:30:02% 割平面法的实现 % X: 目标函数的最优解 % Z: 目标函数的极小值 % AAA:满足整数条件的最终表中的系数矩阵 % BBB:满足整数条件的最终表中的常数列向量 % A: 约束函数的系数矩阵,输入前需保证每个约束条件均为或≤号... -
Matlab数值分析与绘图基础(全)
2014-04-14 10:43:582.7.1 特征值与特征向量的求法 33 2.7.2 提高特征值的计算精度 33 2.8 秩与线性相关性 34 2.8.1 矩阵和向量组的秩以及向量组的线性相关性 34 2.8.2 求行阶梯矩阵及向量组的基 34 第三章 多项式 35 3.1 多项式的表达... -
MATLAB7.x数字信号处理
2013-05-07 12:10:40ex4_20 利用Z平面的简单零极点法设计一个高通滤波器 ex5_1 I-型线性相位FIR滤波器 ex5_2 II-型线性相位FIR滤波器 ex5_3 III-型线性相位FIR滤波器 ex5_4 IV-型线性相位FIR滤波器 ex5_5 矩形窗频响 ex5_6 希尔伯特... -
《MATLAB在日常计算中的应用》【杜树春】样章
2018-08-14 00:43:183.2.7画三维平面图 3.2.8画瀑布图 3.2.9画伞状图 3.2.10画花蕊图 3.2.11画正立方体 3.3小结 第4章复数运算 4.1复数简介 4.1.1复数 4.1.2复数的四种表示形式 4.1.3复数的四则运算 4.1.4复数的其他运算 ... -
matlab 神经网络原理与实例精解 陈明著
2016-08-03 02:59:049.6.1 二维平面上的联想记忆网络/296 9.6.2 Elman 股价预测/303 第 10 章 随机神经网络( 教学视频:40 分钟)/308 10.1 模拟退火算法/308 10.1.1 模拟退火算法的引出/308 10.1.2 退火算法的参数控制/310 10.2 ... -
MATLAB7.x数字信号处理 源代码
2008-10-30 18:57:20ex4_20 利用Z平面的简单零极点法设计一个高通滤波器 ex5_1 I-型线性相位FIR滤波器 ex5_2 II-型线性相位FIR滤波器 ex5_3 III-型线性相位FIR滤波器 ex5_4 IV-型线性相位FIR滤波器 ex5_5 矩形窗频响 ex5_6 希尔伯特... -
基于粒子群标定的多介质折射成像定位算法
2021-02-25 07:39:16应用Matlab软件标定工具箱得到摄像机内、外参数,在此基础上,采用粒子群优化算法标定折射平面法向量和光心到折射平面的距离,然后应用光线追踪方法,给出了一种多介质条件下的目标精确定位算法。实验结果表明,当被... -
模式识别第4版(中文版+英文版+PPT源码)
2018-09-13 20:10:483.1 引言 3.2 线性判别函数和决策超平面 3.3 感知器算法 3.4 最小二乘法 3.5 均方估计的回顾 3.6 逻辑识别 3.7 支持向量机 习题 MATLAB编程和练习 参考文献 第4章 非线性分类器 4.1 引言 4.2 异或问题 4.3 两层感知... -
调用scipy中的优化算法fmin_bfgs(拟牛顿法Broyden-Fletcher-Goldfarb-Shanno costFunction是自己实现的一个求代价的函数, initial_theta表示初始化的值, fprime指定costFunction的梯度 args是其余测参数,以元组的...
-
-
LSHBOX:局部敏感算法(LSH)的C++工具箱,提供了好几种普遍的LSH算法,也可以支持Python和MATLAB。 PGM-index:能够快速查找、前导、范围搜索和更新数以亿计项数组的数据结构,其跟传统索引相比,使用梯度的顺序而...