1.求决策树源代码。源码最好使用matlab实现。大全
2.Cartographer源码详解|(2)Cartographer_ros
3.编程将二维数组matrix中的源码每一列元素向右移动一列,而原来最右侧那一列元素移动到最左边。大全怎么做?
4.[LaTeX 漫谈] 数学矩阵:从 TeX Primitives 到 nicematrix 宏包
5.cesium 实现 3d-tiles 平移旋转贴地(附源码下载)
6.Eigen的源码介绍、安装与入门操作
求决策树源代码。大全电子杂志网站源码最好使用matlab实现。源码
function [Tree RulesMatrix]=DecisionTree(DataSet,大全AttributName)
%输入为训练集,为离散后的源码数字,如记录1:1 1 3 2 1;
%前面为属性列,大全最后一列为类标
if nargin<1
error('请输入数据集');
else
if isstr(DataSet)
[DataSet AttributValue]=readdata2(DataSet);
else
AttributValue=[];
end
end
if nargin<2
AttributName=[];
end
Attributs=[1:size(DataSet,源码2)-1];
Tree=CreatTree(DataSet,Attributs);
disp([char() 'The Decision Tree:']);
showTree(Tree,0,0,1,AttributValue,AttributName);
Rules=getRule(Tree);
RulesMatrix=zeros(size(Rules,1),size(DataSet,2));
for i=1:size(Rules,1)
rule=cell2struct(Rules(i,1),{ 'str'});
rule=str2num([rule.str([1:(find(rule.str=='C')-1)]) rule.str((find(rule.str=='C')+1):length(rule.str))]);
for j=1:(length(rule)-1)/2
RulesMatrix(i,rule((j-1)*2+1))=rule(j*2);
end
RulesMatrix(i,size(DataSet,2))=rule(length(rule));
end
end
function Tree=CreatTree(DataSet,Attributs) %决策树程序 输入为:数据集,属性名列表
%disp(Attributs);
[S ValRecords]=ComputEntropy(DataSet,大全0);
if(S==0) %当样例全为一类时退出,返回叶子节点类标
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)==size(DataSet,源码1))
break;
end
end
Tree.Attribut=i;
Tree.Child=[];
return;
end
if(length(Attributs)==0) %当条件属性个数为0时返回占多数的类标
mostlabelnum=0;
mostlabel=0;
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)>mostlabelnum)
mostlabelnum=length(ValRecords(i).matrix);
mostlabel=i;
end
end
Tree.Attribut=mostlabel;
Tree.Child=[];
return;
end
for i=1:length(Attributs)
[Sa(i) ValRecord]=ComputEntropy(DataSet,i);
Gains(i)=S-Sa(i);
AtrributMatric(i).val=ValRecord;
end
[maxval maxindex]=max(Gains);
Tree.Attribut=Attributs(maxindex);
Attributs2=[Attributs(1:maxindex-1) Attributs(maxindex+1:length(Attributs))];
for j=1:length(AtrributMatric(maxindex).val)
DataSet2=[DataSet(AtrributMatric(maxindex).val(j).matrix',1:maxindex-1) DataSet(AtrributMatric(maxindex).val(j).matrix',maxindex+1:size(DataSet,2))];
if(size(DataSet2,1)==0)
mostlabelnum=0;
mostlabel=0;
for i=1:length(ValRecords)
if(length(ValRecords(i).matrix)>mostlabelnum)
mostlabelnum=length(ValRecords(i).matrix);
mostlabel=i;
end
end
Tree.Child(j).root.Attribut=mostlabel;
Tree.Child(j).root.Child=[];
else
Tree.Child(j).root=CreatTree(DataSet2,Attributs2);
end
end
end
function [Entropy RecordVal]=ComputEntropy(DataSet,attribut) %计算信息熵
if(attribut==0)
clnum=0;
for i=1:size(DataSet,1)
if(DataSet(i,size(DataSet,2))>clnum) %防止下标越界
classnum(DataSet(i,size(DataSet,2)))=0;
clnum=DataSet(i,size(DataSet,2));
RecordVal(DataSet(i,size(DataSet,2))).matrix=[];
end
classnum(DataSet(i,size(DataSet,2)))=classnum(DataSet(i,size(DataSet,2)))+1;
RecordVal(DataSet(i,size(DataSet,2))).matrix=[RecordVal(DataSet(i,size(DataSet,2))).matrix i];
end
Entropy=0;
for j=1:length(classnum)
P=classnum(j)/size(DataSet,1);
if(P~=0)
Entropy=Entropy+(-P)*log2(P);
end
end
else
valnum=0;
for i=1:size(DataSet,1)
if(DataSet(i,attribut)>valnum) %防止参数下标越界
clnum(DataSet(i,attribut))=0;
valnum=DataSet(i,attribut);
Valueexamnum(DataSet(i,attribut))=0;
RecordVal(DataSet(i,attribut)).matrix=[]; %将编号保留下来,以方便后面按值分割数据集
end
if(DataSet(i,大全size(DataSet,2))>clnum(DataSet(i,attribut))) %防止下标越界
Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))=0;
clnum(DataSet(i,attribut))=DataSet(i,size(DataSet,2));
end
Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))= Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))+1;
Valueexamnum(DataSet(i,attribut))= Valueexamnum(DataSet(i,attribut))+1;
RecordVal(DataSet(i,attribut)).matrix=[RecordVal(DataSet(i,attribut)).matrix i];
end
Entropy=0;
for j=1:valnum
Entropys=0;
for k=1:length(Value(j).classnum)
P=Value(j).classnum(k)/Valueexamnum(j);
if(P~=0)
Entropys=Entropys+(-P)*log2(P);
end
end
Entropy=Entropy+(Valueexamnum(j)/size(DataSet,1))*Entropys;
end
end
end
function showTree(Tree,level,value,branch,AttributValue,AttributName)
blank=[];
for i=1:level-1
if(branch(i)==1)
blank=[blank ' |'];
else
blank=[blank ' '];
end
end
blank=[blank ' '];
if(level==0)
blank=[' (The Root):'];
else
if isempty(AttributValue)
blank=[blank '|_____' int2str(value) '______'];
else
blank=[blank '|_____' value '______'];
end
end
if(length(Tree.Child)~=0) %非叶子节点
if isempty(AttributName)
disp([blank 'Attribut ' int2str(Tree.Attribut)]);
else
disp([blank 'Attribut ' AttributName{ Tree.Attribut}]);
end
if isempty(AttributValue)
for j=1:length(Tree.Child)-1
showTree(Tree.Child(j).root,level+1,j,[branch 1],AttributValue,AttributName);
end
showTree(Tree.Child(length(Tree.Child)).root,level+1,length(Tree.Child),[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);
else
for j=1:length(Tree.Child)-1
showTree(Tree.Child(j).root,level+1,AttributValue{ Tree.Attribut}{ j},[branch 1],AttributValue,AttributName);
end
showTree(Tree.Child(length(Tree.Child)).root,level+1,AttributValue{ Tree.Attribut}{ length(Tree.Child)},[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);
end
else
if isempty(AttributValue)
disp([blank 'leaf ' int2str(Tree.Attribut)]);
else
disp([blank 'leaf ' AttributValue{ length(AttributValue)}{ Tree.Attribut}]);
end
end
end
function Rules=getRule(Tree)
if(length(Tree.Child)~=0)
Rules={ };
for i=1:length(Tree.Child)
content=getRule(Tree.Child(i).root);
%disp(content);
%disp([num2str(Tree.Attribut) ',' num2str(i) ',']);
for j=1:size(content,1)
rule=cell2struct(content(j,1),{ 'str'});
content(j,1)={ [num2str(Tree.Attribut) ',' num2str(i) ',' rule.str]};
end
Rules=[Rules;content];
end
else
Rules={ ['C' num2str(Tree.Attribut)]};
end
end
Cartographer源码详解|(2)Cartographer_ros
上一篇文章深入分析了传感器数据的流向,接下来让我们继续探讨传感器格式的源码转换与类型变换。这部分内容在sensor_bridge.cc文件中。在处理传感器的坐标变换时,我们需要运用三维空间刚体运动的知识,先进行简要回顾,以助于理解代码。
三维空间刚体运动涉及向量内积与外积。向量内积的计算公式如下,表示两个向量的点乘。向量外积则是一个向量,其方向垂直于两个向量,大小为两向量张成四边形的有向面积,计算公式如下。同花顺9转源码
旋转和平移是欧氏变换的两个关键部分。旋转涉及单位正交基的变换,形成旋转矩阵(Rotation matrix),该矩阵的各分量由两组基之间的内积组成,反映了旋转前后同一向量坐标的变化关系。平移则通过向旋转后的坐标中加入平移向量t实现。通过旋转矩阵R和平移向量t,我们可以完整描述欧氏空间中的坐标变换关系。
为了简化变换过程,引入齐次坐标和变换矩阵。在三维向量末尾添加1形成四维向量,进行线性变换。变换矩阵T能够将两次变换叠加简化为一个操作,便于后续计算。
Cartographer的坐标转换程序位于transform文件夹下的rigid_transform中,用于求解变换矩阵的逆。
在sensor_bridge类中,构造函数将传入配置参数,对里程计数据进行处理。首先将ros时间转换为ICU时间,然后利用tf_bridge_.LookupToTracking函数找到tracking坐标系与里程计child_frame_id之间的坐标变换。在ToOdometryData函数中,将里程计的footprint的pose转换为tracking_frame的pose,并最终将结果转换为carto::sensor::OdometryData的数据类型。
HandleOdometryMessage函数将传感器数据类型与坐标系转换完成后,调用trajectory_builder_->AddSensorData进行数据处理。接力双阳指标源码对于雷达数据,首先转换为点云格式,然后对点云进行坐标变换,并调用trajectory_builder_->AddSensorData进行数据处理。
IMU数据处理中,要求平移分量小于1e-5,然后调用trajectory_builder_->AddSensorData对数据进行处理。
在雷达数据处理部分,首先将点云数据分段,然后传给HandleRangefinder处理,将点云坐标变换到tracking_frame坐标系下,调用trajectory_builder_->AddSensorData函数进行数据处理。
总结本章内容,我们详细解析了SensorBridge类,对传感器数据进行了转换和传输。通过Node类、MapBuilderBridge类和SensorBridge类,我们对Cartographer_ros部分的代码有了基本了解。接下来,我们将深入学习cartographer。
编程将二维数组matrix中的每一列元素向右移动一列,而原来最右侧那一列元素移动到最左边。怎么做?
以4×4二维数组为例,C代码和运行结果如下:可见输出符合要求,望采纳~
附源码:
#include <stdio.h>
void display(int a[4][4]) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
printf("%-4d", a[i][j]);
printf("\n");
}
}
int main() {
int a[4][4] = { { 1,2,3,4}, { 5,6,7,8}, { 9,,,}, { ,,,}};
int i, j, t;
printf("原数组:\n");
display(a);
for (i = 0; i < 4; i++) {
t = a[i][3]; // 先保存最右一列数据
for (j = 3; j > 0; j--) // 所有列右移,注意要倒序
a[i][j] = a[i][j - 1];
a[i][0] = t; // 最后将原最右一列数据赋给第一列
}
printf("新数组:\n");
display(a);
return 0;
}
[LaTeX 漫谈] 数学矩阵:从 TeX Primitives 到 nicematrix 宏包
本文深入探讨 LaTeX 矩阵的qt creator源码调试处理方式,从基础的 TeX Primitives 到进阶的 nicematrix 宏包,一步步解析矩阵在数学模式下的应用。
在数学模式下,矩阵是指包含多行多列内容、左右侧有可选定界符的数学式,广泛用于表示数理学科中的矩阵和行列式等数学对象。
首先,提及的是 TeX Primitives 中的 \halign、\valign 和 \noalign,它们主要用于表格和对齐操作的内部,很少直接使用。
在 Plain TeX 格式中,提供了 \matrix、\pmatrix 和 \bordermatrix 命令,基于 TeX Primitives,它们主要用于处理矩阵。
LaTeX2e 格式在此基础上,继承了 Plain TeX 的三个命令,并加强为健壮命令,同时引入了 array 环境,其用法与 tabular 环境类似,允许用户控制列对齐。
amsmath 宏包提供了一系列矩阵环境,如 bmatrix、pmatrix 和 vmatrix,它们在数学排版中扮演重要角色。jar咋查看源码
值得注意的是,当加载 amsmath 宏包后,原 \matrix 和 \pmatrix 命令将无法使用。
当遇到标准扩展无法满足的需求时,可以寻找其他宏包和文档进行小修补和拓展,如 TikZ 宏包,它能简化某些标记需求,为矩阵绘图提供了便利。
TikZ 宏包能生成矩阵,其行列间距与 amsmath 有所不同。借助 tikzmark 宏包,可以实现矩阵单元格的相对位置标记,但这可能导致矩阵输入变得复杂。
最后推荐的 nicematrix 宏包具备多种优势,如自定义行列间距、调整矩阵外观、提供标记功能等。通过例子展示,nicematrix 宏包让矩阵处理更加直观且便捷。
示例源码可参见项目 muzimuzhi/latex-examples 中的文件 matrix-from-plaintex-to-nicematrix.*,供进一步研究和实践使用。
cesium 实现 3d-tiles 平移旋转贴地(附源码下载)
cesium 实现三维瓷砖平移旋转贴地是一个涉及3D建模与cesium平台交互的技术操作。为了使三维瓷砖在cesium环境中实现平移和旋转,并使其贴合地面,核心在于应用旋转、平移矩阵的相乘原理,具体操作步骤如下:
首先,根据cesium API文档,我们需要熟悉并掌握Cesium.Matrix3类的使用,特别是从旋转轴(X、Y、Z轴)创建旋转矩阵的函数,如Cesium.Matrix3.fromRotationX、Cesium.Matrix3.fromRotationY、Cesium.Matrix3.fromRotationZ等。这些矩阵用于控制三维物体的旋转方向和角度。
接着,为了实现物体的平移,我们使用Cesium.Matrix4.fromRotationTranslation函数结合Cesium.Matrix4.multiply函数,将旋转与平移矩阵相乘,进而调整三维模型的位置。这个过程涉及到三维空间中的坐标变换,确保模型能够精确地贴合地面或按照预期路径移动。
在实现过程中,参考的资源包括文章和教程,如jianshu.com和cesium.xin的WordPress文章,这些资源提供了理论指导和实践示例,帮助开发者理解和应用cesium平台的高级功能。
完成上述步骤后,开发者可以通过cesium的在线实例和官方API文档进行验证和调试,确保实现效果符合预期。
为了方便学习和实践,提供了一个源代码示例下载链接:pan.baidu.com/s/1mIkVg5... 提取码:dh6k。通过下载并运行该代码,开发者可以直接观察和理解如何在cesium环境中实现三维瓷砖的平移旋转贴地操作。
Eigen的介绍、安装与入门操作
Eigen是一个C++的开源模板库,专用于线性代数运算,包括向量和矩阵操作,以及数值分析等。它以头文件形式存在,无需编译,只需在cpp文件中添加`#include "Eigen/Dense"`即可使用。安装与入门
在Ubuntu Server .上,Eigen的安装有两条路径:通过apt命令或手动编译。1. apt命令安装
虽然简单,但apt包更新较慢,可能不是最新版本,这可能影响依赖于最新Eigen的库的使用。检查版本的命令是:`apt-cache policy eigen`。2. 手动编译安装
从Eigen官网下载源码或使用wget,解压后进入目录,然后进行编译。安装成功后,可以通过编写并运行代码验证,如`MatrixXd matrix = MatrixXd::Random(2, 2); cout << matrix << endl;`。实例演示
矩阵操作
创建一个2x2矩阵,赋值并输出,如`MatrixXd m = MatrixXd::Random(2, 2); cout << m << endl;`。矩阵与向量
定义一个3x3矩阵和3维向量,进行矩阵加常数和矩阵向量乘法,展示其运算结果。总结
本文简要介绍了Eigen的基本概念、安装方法、头文件使用以及入门级的矩阵向量操作。深入学习Eigen,还有更多内容等待探索。Matrix卡顿优化之IdleHandlerLagTracer源码分析
IdleHandler是Android系统提供的一种机制,用于在消息队列空闲时执行任务,其任务优先级低于主线程,适用于实时性要求不高的任务。通常用于优化Android应用启动速度。然而,matrix卡顿优化中对IdleHandler进行监控的原因在于,IdleHandler属于主线程卡顿监控的关键环节。当IdleHandler中出现耗时任务执行,会明显导致主线程卡顿。
为了进行性能优化,matrix对IdleHandler进行监控变得必要。IdleHandler监控的关键在于在TracePlugin中进行初始化和调用。构造方法仅接收配置,包含IdleHandler监控开关。onStartTrace方法调用onAlive方法,初始化HandlerThread,创建IdleHandlerLagRunnable,并启动检测IdleHandler的执行。
IdleHandlerLagRunnable负责上报信息。detectIdleHandler方法通过反射获取mIdleHandlers列表,并通过MyArrayList实现hook点,监控IdleHandler的添加和移除。当消息队列添加IdleHandler时,MyArrayList的add方法将IdleHandler包装为MyIdleHandler存入,拦截queueIdle方法调用。
MyIdleHandler继承自IdleHandler,重写queueIdle方法,监控IdleHandler执行过程。当IdleHandler执行时,idleHandlerLagHandler发送延时消息到子线程。若2s内未完成,收集信息上报,发现IdleHandler导致的卡顿问题。
IdleHandlerLagTracer通过hook替换消息队列的IdleHandlers集合,拦截添加和移除逻辑,为原IdleHandler添加代理,监控queueIdle方法执行。超时未执行完成则收集信息上报,有效发现IdleHandler导致的卡顿。
性能优化是Android开发中重要的一环,掌握IdleHandler监控机制有助于更细致地进行性能调优。此外,推荐关注Android学习资源,涵盖性能优化、框架底层原理、车载开发、逆向安全、音视频技术、Jetpack全家桶、OkHttp源码解析、Kotlin、Gradle、Flutter等多领域内容,助力深入学习和提升技术能力。
Android性能优化、框架底层原理、车载开发、逆向安全、音视频技术、Jetpack全家桶、OkHttp源码解析、Kotlin、Gradle、Flutter等学习资源,助力深化技术理解与应用。
android Matrix.setRotate å postRotateçåºå«
Matrix主è¦ç¨äºå¯¹å¹³é¢è¿è¡å¹³ç§»(Translate)ï¼ç¼©æ¾(Scale)ï¼æ转(Rotate)以åæå(Skew)æä½ã
为ç®åç©éµåæ¢ï¼Androidå°è£ äºä¸ç³»åæ¹æ³æ¥è¿è¡ç©éµåæ¢ï¼å ¶ä¸å æ¬ï¼
setç³»åæ¹æ³ï¼setTranslateï¼setScaleï¼setRotateï¼setSkewï¼è®¾ç½®ï¼ä¼è¦çä¹åçåæ°ã
preç³»åæ¹æ³ï¼preTranslateï¼preScaleï¼preRotateï¼preSkewï¼ç©éµå ä¹ï¼å¦M' = M * T(dx, dy)ã
postç³»åæ¹æ³ï¼postTranslateï¼postScaleï¼postRotateï¼postSkewï¼ç©éµåä¹ï¼å¦M' = T(dx, dy) * Mã
éè¿å°åæ¢ç©éµä¸åå§ç©éµç¸ä¹æ¥è¾¾å°åæ¢çç®çï¼ä¾å¦ï¼
平移ï¼x'=x+txï¼y'=y+tyï¼ï¼
缩æ¾ï¼x'=sx*xï¼y'=sy*yï¼ï¼
æ转ï¼x'=cosβ*x-sinβ*yï¼y'=sinβ*x+cosβ*yï¼ï¼
éæ©éè¦ç¨å°å¦ä¸çä¸è§å½æ°çå ¬å¼ï¼
â sin(α+β)=sinαcosβ+cosαsinβ
â¡cos(α+β)=cosαcosβ-sinαsinβ
å ¬å¼â å¯ä»¥ç±åä½åæ¹æ³ææåå¯å®çæ¨å¯¼åºæ¥ã
æ¨å¯¼è¿ç¨åè§ï¼/s/blog_fcj.html
æåï¼x'=x+k1*yï¼y'=k2*x+yï¼ï¼
//æºç æ件ï¼external\skia\legacy\src\core\SkMatrix.cpp
#define SK_Scalar1 (1.0f)
#define kMatrixElem SK_Scalar1
typedef float SkScalar;
#define SkScalarMul(a, b) ((float)(a) * (b))
enum {
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
};
void SkMatrix::reset() {
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMTransX] = fMat[kMTransY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);
}
void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] = dx; //以æ°å¼dxè¦çåå¼ï¼åå¼æ æäº
fMat[kMTransY] = dy;
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);
} else {
this->reset();
}
}
bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->preConcat(m); //ç©éµçå ä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +
SkScalarMul(fMat[kMSkewX], dy); //å ä¹ï¼éè¦ç©éµè¿ç®è¿
fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +
SkScalarMul(fMat[kMScaleY], dy);
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->postConcat(m); //ç©éµçåä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += dx; //åä¹ï¼ç´æ¥å æ°å¼dxå³å¯
fMat[kMTransY] += dy;
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::preConcat(
2024-12-26 00:13
2024-12-26 00:05
2024-12-25 23:51
2024-12-25 23:07
2024-12-25 23:04
2024-12-25 22:59
2024-12-25 22:48
2024-12-25 22:38