目录

前言:

实现:

寻找路径:

判断是否在路上,且返回值

整体实现矩阵:

调用:



前言:

有向图,多刚体动力学的基本图论思想、铰链(弧)、邻接刚体、整标函数、内外侧刚体等基本概念已经知道。

因为是树系统,构建就比较简单,每一个刚体到零刚体的路只有一条。非树系统通过切铰、切刚体转为树系统。

总的输入参数包括 铰链的序号、及每一个铰链的起点刚体、终点刚体,以及全部的铰链数目。采取matlab2021a编程,设置为结构体输入。且铰链序号从1→n 顺序排列。

全部代码链接:树系统全关联矩阵通路矩阵.7z-其它文档类资源-CSDN文库

代码和文章里的一样,不用下载。

bilibil链接:树系统的全关联矩阵、通路矩阵 - 哔哩哔哩 (bilibili.com)


实现:

全关联矩阵是比较容易实现的,因为每一个铰链对应两个刚体,且必为起点、终点,也就是全关联矩阵中没一列只有两个值是-1,1,其余为0。即每一列和为0。

通路矩阵相较难实现。当然可以利用TS = ST =E,计算,但是本意是想用该式验证通路矩阵正确性。通路矩阵设计以下几个分步骤:

1、得到零刚体B0到任一刚体Bi的路径

2、判断铰链是否在该该路上,且是否指向零刚体

其中第一步采取广度优先的搜索策略。matlab中  [0,1,2,[3,4],[],5] = [0,1,2,3,4,5] 比较方便


寻找路径:

1、实现每一个点的子节点。

输入:一个点的编号;全部点的数据(2行n列,矩阵,第一行是起点,第二行终点)、closeTable(存储已经遍历过的列,不重复)

输出:子节点(向量), 新的closeTable

%得到下一层的点 输入:当前点(一个数)、整体点的数据(2,n)、closeTable
function [nextLayerPoints, closeTable] = getNextLayerPoints(nowPoint, hingleInOut, closeTable)isNowPoint = hingleInOut == nowPoint;%返回整体数据中包含当前点的状态nextLayerPoints = [];for j = 1:size(hingleInOut, 2)%若已经遍历过了 则跳过if(sum(closeTable == j))continue;end%若找到了 则存储 并把该列加进closeTable%nowPoint是起点,则下一层存储终点;反之亦然if(isNowPoint(1,j) == 1)nextLayerPoints = [nextLayerPoints,hingleInOut(2,j)];closeTable = [closeTable, j];endif(isNowPoint(2,j) == 1)nextLayerPoints = [nextLayerPoints,hingleInOut(1,j)];closeTable = [closeTable, j];endend
end

2、得到从B0 到终点的搜寻到的全部点 及其父节点 (存储父节点方便查找路)

输入:终点序号、全部点的数据(2行n列,矩阵,第一行是起点,第二行终点);

输出:查询过得全部点、及其父节点(从零刚体B0,到终点所在的层)

%得到从B0 到终点的搜寻到的全部点 及其父节点
function [res,resLast] = getSearchRes(endPoint, hingleInOut)searchedAllPoints = [0];%从B0到终点 搜寻到的全部点searchedAllPoints_Last = [0];%搜寻到的点 的父节点nowLayerAllPoints = [0];%当前层的点nextLayerAllPoints = [];%下一层的点nextLayerAllPoints_Last = [];%下一层的点 对应的父节点closeTable = [];%哪些列已经遍历过了 不再遍历cycleState = 1;while(cycleState)for i = 1:size(nowLayerAllPoints, 2)nowLayer_Point = nowLayerAllPoints(i);%取出当前层其中一个点%搜到终点 则跳出if(nowLayer_Point == endPoint)cycleState = 0;break;end[nextLayerPoints, closeTable] = getNextLayerPoints(nowLayer_Point, hingleInOut, closeTable);%nectLayerPoints只是 一个点搜寻到的下一层中的点nextLayerAllPoints = [nextLayerAllPoints, nextLayerPoints];%首先得到下一层点的个数nextLayerNums = size(nextLayerAllPoints, 2);nextLayerAllPoints_Last = [nextLayerAllPoints_Last, ones(1,nextLayerNums) .* nowLayer_Point];end%若下一层为空 则结束 证明搜完了if(isempty(nextLayerAllPoints))cycleState = 0;break;end%下一层的点存入整个队列里面searchedAllPoints = [searchedAllPoints, nextLayerAllPoints];%把该层点 的父节点存入searchedAllPoints_Last = [searchedAllPoints_Last, nextLayerAllPoints_Last];nowLayerAllPoints = nextLayerAllPoints;nextLayerAllPoints = [];nextLayerAllPoints_Last = [];endres = searchedAllPoints;resLast = searchedAllPoints_Last;
end 

3、寻找到终点得唯一路

输入:终点序号、全部点数据

输出:路序列

%寻找到终点的路径
function res = GetPath(endPoint,hingleInOut)[searchedAllPoints, searchedAllPoints_Last] = getSearchRes(endPoint,hingleInOut);%获得 路径res = [endPoint];nowPoint = endPoint;while(nowPoint ~= 0)nowPoint_Index = find(searchedAllPoints == nowPoint);lastPoint = searchedAllPoints_Last(nowPoint_Index);res = [lastPoint,res];nowPoint = lastPoint;end
end

上述三个函数封装在一个函数文件。GetPath.m


判断是否在路上,且返回值

从路序列中 查询每一对邻接刚体中的铰链是否包含该铰链。并根据起点终点方向来判断是否背离零刚体。封装在IsInPath.m文件中

输入:铰链序号、刚体序号、整体数据的结构体

输出:-1、1、0状态

%判断是否在通路上 据规则返回-1 1 0
function res = IsInPath(hingleNum, endPoint,AdjacentBody)%得到 至终点的 路径hingleInOut = [AdjacentBody.hingleIn;AdjacentBody.hingleOut];Channel = GetPath(endPoint, hingleInOut);hingleIndex = find(AdjacentBody.hingleNumber == hingleNum);hingleIn = hingleInOut(1,hingleIndex);hingleOut = hingleInOut(2,hingleIndex);res = 0; %不在通路上则 返回0%邻接刚体之间是否有 该铰链for i = 1:size(Channel, 2)-1%若有 且指向 顺序, 表示指向外侧(背离B0) 为-1if((Channel(i)==hingleIn)&&(Channel(i+1)==hingleOut))res = -1;end%若有 且指向 逆序, 表示指向内侧(B0) 为1if((Channel(i)==hingleOut)&&(Channel(i+1)==hingleIn))res = 1;endend
end 

整体实现矩阵:

存在MultiBody.m文件中

classdef MultiBodypropertieshingleNumberhingleInhingleOuthingleNumsendmethodsfunction obj = MultiBody(AdjacentBody_Struct)obj.hingleNumber = AdjacentBody_Struct.hingleNumber;obj.hingleIn = AdjacentBody_Struct.hingleIn;obj.hingleOut = AdjacentBody_Struct.hingleOut;obj.hingleNums = size(AdjacentBody_Struct.hingleNumber,2);endfunction S_Total = getTotalCorrMat(obj)%全关联矩阵total_correlation_matrix = zeros(obj.hingleNums+1, obj.hingleNums);for j = 1:obj.hingleNumshingleInBody = obj.hingleIn(j);hingleOutBody = obj.hingleOut(j);total_correlation_matrix(hingleInBody+1,j) = 1;total_correlation_matrix(hingleOutBody+1,j) = -1;endS_Total = total_correlation_matrix;endfunction T = getChannelMat(obj)%通路矩阵channel_matrix = zeros(obj.hingleNums, obj.hingleNums);for j = 1:obj.hingleNumsfor i = 1:obj.hingleNumschannel_matrix(j,i) = IsInPath(j, i, obj);endendT = channel_matrix;endend
end

调用:

AdjacentBody.hingleNumber = [1,2,3,4,5];
AdjacentBody.hingleIn = [0,3,1,5,4];
AdjacentBody.hingleOut = [1,1,5,2,5];
AdjacentBody.hingleNums = 5;MultiBodySystem = MultiBody(AdjacentBody);
S  = MultiBodySystem.getTotalCorrMat();
T = MultiBodySystem.getChannelMat();
S(2:end,:) * T

树系统的全关联矩阵、通路矩阵相关推荐

  1. 离散数学实验2关联矩阵相邻矩阵

    代码展示 #include <iostream> using namespace std; int XLmatrix[100][100] = { 0 };//输入的相邻矩阵 int n;/ ...

  2. 腾讯郭振宇:腾讯云发布云IoT全栈产品矩阵,详解6大产品及3大案例

    5月21-23日,由云南省人民政府指导,云南省文化和旅游厅.昆明市人民政府.腾讯公司共同主办,腾讯战略升级后打造的规格最高.规模最大的行业生态大会"全球数字生态大会"在昆明隆重举行 ...

  3. Mac osx系统中virtual box 中的Ubuntu系统的全屏显示问题解决

    Mac osx系统中virtual box 中的Ubuntu系统的全屏显示问题解决 一 安装virtualBox工具 安装失败 其他尝试方法 一 安装virtualBox工具 选择Insert Gue ...

  4. 系统缓存全解析 [转]

    有时候总听到网友说网站运行好慢,不知如何是好:有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差.没有"勤俭节约"的意识,势必会造成"铺张浪费" ...

  5. 数字滤波器(二)--最小相位延时系统和全通系统

    最小相位延时系统和全通系统 引 1. 系统相位 2. 最小相位延时系统 2.1 最小相位延时系统 2.2 最小相位延时系统的性质 3. 全通系统 3.1 定义与系统函数 3.2 全通系统的零极点关系 ...

  6. Android系统联系人全特效实现(下),字母表快速滚动

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9050671 在上一篇文章中,我和大家一起实现了类似于Android系统联系人的分组 ...

  7. Android系统联系人全特效实现(上),分组导航和挤压动画

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9033553 记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根 ...

  8. 图像处理 Matlab GUI系统(全)

    目录 导读 数字图像处理系统 GUI实例设计 总结 [若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动力,万分感谢!] 导读 以数字图像处理系统设计为例,介绍GUI系统的设计流程, ...

  9. 直板android智能手机,小巧又精悍 3大系统直板全键盘手机搜罗

    虽然目前手机里面全触控大屏幕的风潮大行其道,但是依然有不少朋友使用不惯全触屏手机,因为全触屏的手机打字的时候速度会非常的慢.对手机打字要求比较高的朋友一般都会比较喜欢全键盘的手机,而在全键盘的机型中, ...

最新文章

  1. 倒计时1天,2018 AI开发者报名通道即将关闭(附参会提醒)
  2. Vmware VsPhere下的VM如何安装Hyper-v服务
  3. Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学
  4. 从HTML5移动应用现状谈发展趋势
  5. 【JQuery】on/off 绑定事件和解绑事件
  6. React+Redux仿Web追书神器
  7. 用Spring组成自定义注释
  8. 【投资策略】2022 年大类资产配置展望:稳中求进-中金公司
  9. Swift语言指南(一)--语言基础之常量和变量
  10. 用scikit-learn和pandas实现线性回归
  11. 基于FPGA的跨时钟域信号处理——专用握手信号
  12. flowable工作流_使用Bash Shell实现flowable配置文件修改定制
  13. 远程桌面管理工具汇总
  14. 华为手机解锁码计算工具_手机计算器全线阵亡?小编实测苹果、华为、三星……...
  15. fill函数 神奇的迭代器
  16. 计算机多媒体教室管理制度,新疆大学多媒体教室管理制度
  17. 俄罗斯方块游戏51单片机实现
  18. java faker_小飞博客-java测试造数据神器JavaFaker
  19. PP实施经验分享(4)——SAP中BOM应用
  20. Yolo 一文看懂目标检测

热门文章

  1. loadrunner java脚本_用loadrunner11写java脚本小例子(java Vuser)
  2. win10远程桌面设置计算机,win10设置远程桌面连接的方法_win10如何设置远程桌面连接...
  3. 【萧氏布局】:黄金、白银TD、纸白银、行情解析布局操作
  4. unturned服务器配置文件,unturned服务器配置
  5. 2021年系统集成项目管理工程师报名条件
  6. 人工智能--Keras卷积神经网络
  7. Python入门(中)—— 列表及元组
  8. 计算机仿真在机械应用,浅谈计算机仿真在机械上的应用[精选].doc
  9. 面试题之--Charles抓包原理
  10. 阿里一P7员工为证明自己年入百万,晒出工资,却被网友...