矩阵

坐标转换矩阵

[亡魂溺海] 提交于 2019-12-09 12:01:42
参考:《Robotics,Vision and Control》、《鱼雷航行力学》、其他学位论文 书上直接给出了分别绕x,y,z轴旋转sita角度的矩阵,而且这三个矩阵也经常见到。但值得注意的是,这三个矩阵其实是坐标系的转换矩阵,公示为 原坐标=[坐标转换矩阵]新坐标 而我们通常是希望等式坐标是新坐标系里的坐标,所以此处的矩阵需要求逆,又因为是正交矩阵,所以求逆即转置。 看了一些论文,虽然最后总的坐标转换矩阵是对的,但描述上缺少了将各坐标轴的转换矩阵的转置操作,让人摸不着头脑,如下: 除此之外,也有的书籍和论文,把前面的推导过程省略,直接给出了点对点的坐标转换矩阵,让人感觉很奇怪,甚至怀疑结论的正确性。于此同时,根据建立的坐标系的不同,旋转顺序也有差异,但有一定的标准。 下面《鱼雷航行力学》书上的旋转顺序,是因为建立了“东-天-南”的地面坐标系,即x轴指东,y轴指天,z轴指南,与之对应的雷体坐标系也是按照“东-天-南”来使用,其旋转顺序为y-z-x,分别旋转了航向-俯仰-翻滚角。 而上面的旋转矩阵来自于某些航空类的书籍和论文,因为是z轴在垂直方向(有的是z轴指天,有的是z轴指地),常用的导航角旋转顺序是z-y-x,同样是按照航向-俯仰-翻滚的顺序。 来源: https://www.cnblogs.com/j-c-y/p/12010152.html

PAT Basic 1050 螺旋矩阵 (25 分)

只愿长相守 提交于 2019-12-09 09:48:02
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件: m × n 等于 N; m ≥ n;且 m − n 取所有可能值中的最小值。 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 1,相邻数字以空格分隔。 输出格式: 输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。 输入样例: 12 37 76 20 98 76 42 53 95 60 81 58 93 输出样例: 98 95 93 42 37 81 53 20 76 58 60 76 我个人觉得,有的题目,思路清晰,比写的少更加重要,这道题,考的是设计模式,如何设计出一个OBJ,进行控制性移动,类似小游戏中的主角,可以上下左右移动#include <iostream> #include <cmath> #include <algorithm> using namespace std; int data[10000][10000]={0}; int width,height; enum dir{ l,r,u,d }dir;//枚举设定方向 int x=0,y=0; void changedir(){/

论文笔记(一)SecureML: A System for Scalable Privacy-Preserving Machine Learning

风格不统一 提交于 2019-12-08 20:57:38
SecureML:A system for Scalable Privacy-Preserving Machine Learning 1 摘要及介绍 1.1 模型的大致架构 首先,主要模型中主要有客户端和两台服务器,假设这两台服务器不会恶意合作。   整个训练过程大致分为在线和离线两个阶段,在线阶段的主要任务就是利用本文提出的安全算数技术在共享的十进制数上进行模型的更新,根据混淆电路的思想,除了最后能得到的模型,什么数据也不会暴露出来;离线阶段的主要任务是服务于在线阶段的乘法运算——利用线性同态加密或者不经意传输生成必要的三元组,因为这个开销比较大,后期还提出了一种改进,用客户端来辅助生成三元组; 1.2 主要贡献 为线性回归、逻辑回归、神经网络这三种机器学习算法开发出了新型的隐私保护的深度学习协议 开发出了支持在共享的十进制数上的安全算数操作的技术 对于那些非线性激活函数,如sigmoid softmax,提出了一种支持安全多方计算的替代方案 以上提出的所有技术相较于目前的技术,在保证安全的前提下,速度上都有很大的提升 1.2.1 为三种机器学习算法开发出的隐私保护的协议 线性回归、逻辑回归和神经网络这三种机器学习方案非常简单但也非常常用,而且他们之间思想类似且一种递进的趋势。 所谓思想类似指的是他们都是有监督的机器学习算法,思路都是先前馈,算出交叉熵之后,在利用随机梯度下降

数据结构和算法--二维数组

拜拜、爱过 提交于 2019-12-08 15:15:11
数据结构和算法中最基础的就是数组了,关于数组的定义、存取、遍历等一些基础操作就不讲了,相信大家都已熟练掌握,我这里就不再赘述了。今天讲一讲二维数组。 二维数组简单讲就是:数组元素是数组的数组(莫名拗口),但其实也不难理解。看个例子就完全明白了: var grades = [[10, 20, 30], [40, 50,60], [70, 80, 90]] 数组grades的每一个元素都是数组。相当于构建了一个3x3的数据表格: 10 20 30 40 50 60 70 80 90 遍历二维数组 遍历二维数组有两种方式:按行遍历,按列遍历。 先来看按行遍历 以上面定义的grades为例,我们来求取每行的平均值。很容易想到我们需要做一个嵌套循环,外层循环对应行,内层循环对应列。然后把每行的值相加再求平均值。 function traverseRows(arr) { var rows = arr.length for (var i = 0; i < rows; i++) { var inlen = arr[i].length, total = 0 for (var j = 0; j < inlen; j++) { total += arr[i][j] } console.log('第' + i + '行平均数:' + total / inlen) } } traverseRows

LeetCode 5282. 转化为全零矩阵的最少反转次数 bfs 双向bfs

隐身守侯 提交于 2019-12-08 14:07:25
地址 https://leetcode-cn.com/submissions/detail/39277402/ 题目描述 给你一个 m x n 的二进制矩阵 mat。 每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。) 请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。 二进制矩阵的每一个格子要么是 0 要么是 1 。 全零矩阵是所有格子都为 0 的矩阵。 示例 1: 输入:mat = [[0,0],[0,1]] 输出:3 解释:一个可能的解是反转 (1, 0),然后 (0, 1) ,最后是 (1, 1) 。 示例 2: 输入:mat = [[0]] 输出:0 解释:给出的矩阵是全零矩阵,所以你不需要改变它。 示例 3: 输入:mat = [[1,1,1],[1,0,1],[0,0,0]] 输出:6 示例 4: 输入:mat = [[1,0,0],[1,0,0]] 输出:-1 解释:该矩阵无法转变成全零矩阵 提示: m == mat.length n == mat[0].length 1 <= m <= 3 1 <= n <= 3 mat[i][j] 是 0 或 1 。 算法1 本题同acwing 95.

Z字形编排问题-Java实现

佐手、 提交于 2019-12-08 06:59:23
背景 Z字形编排过程大致是这样的:经过前期处理的图像被分为若干个 的小图像块,此时就从小图像块的左上角开始沿Z字形对图像元素进行遍历,并将遍历所得的结果重新写入等大小的图像块中 经过Z自行排列之后,原图像矩阵中的序号变为如下图所示: 总结规律 对于原始矩阵matrix中的任意元素matrix[i][j]的遍历走向规律可以分为如下三种情况(偶数情况下) 1、如果二维数组中的元素matrix[i][j]中纵坐标j是偶数,且i=0或者i=7,那么遍历路径在矩阵中的走向就是水平向右移动一格。 2、如果二维数组中的元素matrix[i][j]中横坐标i是奇数,且j=0或者j=7,,那么遍历路径在矩阵中的走向就是垂直向下移动一格。 3、除上述规则以外的情况,如果二维数组中的元素matrix[i][j]的横纵坐标和i+j是偶数,则遍历路径在矩阵中的走向就是右上角移动一格;否则,若i+j是奇数,则遍历路径在矩阵中的走向就是左下角移动一格。 当然也需要对奇数情况进行分析,过程和偶数过程一样; Java代码实现 import java.util.Scanner; /** * Z字行编排问题 * 算法之美P48 * Created by xuliugen on 2016/8/18. */ public class ZZiBianPai { public static int SIZE = 8 ; /

【OpenCV】图像几何变换:旋转,缩放,斜切

大憨熊 提交于 2019-12-08 02:56:45
几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。 插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。 空间变换 空间变换对应矩阵的 仿射变换 。一个坐标通过函数变换的新的坐标位置: 所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵: 以最简单的平移变换为例,平移(b1,b2)坐标可以表示为: 因此,平移变换的变换矩阵及逆矩阵记为: 缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为: 选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为: OpenCV中的图像变换函数 基本的放射变换函数: void cvWarpAffine( const CvArr* src,//输入图像 CvArr* dst, //输出图像 const CvMat* map_matrix, //2*3的变换矩阵 int flags=CV_INTER_LINEAR

opencv笔记(二十八)——OpenCV中矩阵的归一化

匆匆过客 提交于 2019-12-08 02:28:14
1. 归一化定义与作用 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。 归一化的目的简而言之, 即归一化数据 。是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。 图像处理中,图片像素点单通道值一般是[0-255]的unsigned char类型,将其转化到[0,1]之间,更方便计算,这就需要用到矩阵的归一化运算。 注 : normalize的原矩阵必须是单通道(src.channel==1) ,函数执行完,无论之前是否初始化结果矩阵,结果矩阵的大小和类型与原矩阵相同。 在使用机器学习算法的数据预处理阶段,归一化也是非常重要的一个步骤。例如在应用SVM之前,缩放是非常重要的。Sarle的神经网络FAQ的第二部分(1997)阐述了缩放的重要性,大多数注意事项也适用于SVM。缩放的最主要优点是能够避免大数值区间的属性过分支配了小数值区间的属性。另一个优点能避免计算过程中数值复杂度。因为关键值通常依赖特征向量的内积

矩阵按键的组合按键触发

≯℡__Kan透↙ 提交于 2019-12-07 22:44:26
/***12个按键,每一个按键都会让蜂鸣器发出“嘀”的一声, 同时按下S1和S12会点亮一个LED灯,同时按下***/ #include "REG52.H" #define const_voice_short 40 #define const_key_time 12 #define const_key_time_comb 14 //组合按键去抖动延时时间 void initial_myself(); void initial_peripheral(); void delay_long(unsigned int uiDelaylong); void T0_time(); void key_service(); void key_scan(); /* 任意两个组合按键不能处于同一行,否则触发性能大打折扣。 做产品的时候,在硬件电路设计中,除了四路行输入要加上拉电阻外, 四路列输出也应该串入一个470欧左右的限流电阻,否则当一行的两个 按键同时按下时,很容易烧坏单片机的IO口。 */ sbit key_sr1=P0^1; //第一行输入 sbit key_sr2=P0^2; //第二行输入 sbit key_sr3=P0^3; //第三行输入 sbit key_dr1=P0^4; //第一列输出 sbit key_dr2=P0^5; //第二列输出 sbit key_dr3=P0^6;

线性代数之矩阵与坐标系的转换

与世无争的帅哥 提交于 2019-12-07 22:26:13
空间中的点是可以用向量来描绘的,这些点的描绘是基于我们自建的欧式空间坐标系下。我们可以用一个行向量来表示一个空间的点。那我们的要进行空间坐标的转换的时候怎么办呢?一个行向量 B,我可以理解成IB,B的三个值既为三个行向量(1,0,0),(0,1,0),(0,0,1)上的三个分量的度量。我们设向量M是一个3x3的向量。M是线性无关。即M得三个行向量a1,a2,a3不共面,Mx=B,这时候 是一个3x1的列向量x。x= X1 Y1 Z1 Mx=(a1*X1,a2*Y1,a3*Z1) 我们可以理解为成Mx的积是在向量a1上的度量是x1,在a2上的度量为y1 ,在a3上的度量为z1.这样的话,Mx=B,B=(b1,b2,b3),所以b1= a1*X1,b2= a2*Y1,b3= ,a3*Z1。b1,b2,b3 是在欧式坐标系下X,Y,Z的三个分量,x1,y1,z1 是在a1,a2,a3 坐标系(这是我们自定的坐标系)的三个分量。即在自定空间M坐标下x 向量(也是M坐标下一点坐标)左乘M之后就得到了欧式坐标系的点的坐标。实现了空间做坐标的转换。要是实现欧式坐标转换到M坐标系下,可以两边同时左乘以一个M的逆矩阵M-1,(M-1)*M*x=(M-1)*B即x=(M-1)*B。一直B即可求出x ,就能的再M坐标系下的点x的坐标。 来源: CSDN 作者: 吴安 链接: https://blog