<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jonathanzh的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jonathanzh</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jonathanzh]]></copyright><item><title><![CDATA[基于功能分支的git工作流]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/113267394</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/113267394</guid><author>jonathanzh</author><pubDate>Wed, 27 Jan 2021 19:47:47 +0800</pubDate><description><![CDATA[基于功能分支的git工作流
文章目录基于功能分支的git工作流实施步骤1 新建issue2 新建功能分支3 在分支上完成修改4 开发过程注意和master同步5 合并多个commit6 提交pull request（github）或merge request（gitlab）7 确定后，合并功能分支8 删除功能分支参考：

主要思想：所有的功能开发应该在一个专门的分支，而不是在master分支上，这样可以方便多个开发者在各自的功能上开发而不会弄乱主干代码。
实施步骤
1 新建issue
在仓库中根据需求，新建]]></description><category></category></item><item><title><![CDATA[python装饰器统计函数执行总时间]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/108518705</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/108518705</guid><author>jonathanzh</author><pubDate>Thu, 10 Sep 2020 17:10:39 +0800</pubDate><description><![CDATA[装饰器统计函数执行总时间
from functools import wraps
def time_func(func):
    elapse_time = 0.
    @wraps(func)
    def newfunc(*args, **kwargs):
        nonlocal elapse_time # 使用外部的变量
        startTime = time.time()
        result = func(*args, **kwargs)
        elap]]></description><category></category></item><item><title><![CDATA[Ubuntu下nvidia驱动安装，以及处理WARNING：ignoring CC version mismatch和禁用nouveau、nvidia-smi couldn’t communicate]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/108053227</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/108053227</guid><author>jonathanzh</author><pubDate>Mon, 17 Aug 2020 12:09:25 +0800</pubDate><description><![CDATA[ubuntu下安装nvidia驱动
一般步骤
1 首先根据显卡型号下载相应版本的驱动NVIDIA**.run文件，网址 https://www.nvidia.com/Download/index.aspx**
2 卸载已有的nvidia版本（看个人需要删除）
sudo apt-get remove --purge nvidia*

3 关闭图形界面
切换到tty控制台下ctrl+alt+f1
sudo service lightdm stop

4 安装驱动
有可能需要加上执行权限
chmod +x ./N]]></description><category></category></item><item><title><![CDATA[numpy的stack、hstack、vstack、concatenate区别及使用建议]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107555317</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107555317</guid><author>jonathanzh</author><pubDate>Fri, 24 Jul 2020 10:27:20 +0800</pubDate><description><![CDATA[numpy的stack、hstack、vstack、concatenate
这几个函数都是对数组进行连接，介绍下区别




函数
增加维度
指定维度操作
数组shape要求




concatenate
不增加
能
除了操作维度，其它必须相同


stack
增加
能
必须完全相同


hstack
不增加
不能
除了操作维度，其它必须相同


vstack
不增加
不能
除了操作维度，其它必须相同


从上表就可以看出，concatenate和stack的区别就在于会不会增加维度
a = np.ara]]></description><category></category></item><item><title><![CDATA[NoMachine - waiting for the desktop user to authorize your connection]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107531103</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107531103</guid><author>jonathanzh</author><pubDate>Thu, 23 Jul 2020 10:41:40 +0800</pubDate><description><![CDATA[NoMachine - waiting for the desktop user to authorize your connection
推荐第二种方式
1 修改桌面权限，连接时都不需要授权
sudo vim /usr/NX/etc/server.cfg

修改以下参数
PhysicalDesktopAuthorization 0

如果没生效重启服务
sudo /etc/NX/nxserver --restart

这种方式可以远程，但是登陆后不是我想要的账户
2 修改连接时自动断开已有连接
同样是在上]]></description><category></category></item><item><title><![CDATA[基于Airsim的sitl模拟环境配置（ubuntu 16.04）]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107491735</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107491735</guid><author>jonathanzh</author><pubDate>Tue, 21 Jul 2020 16:22:03 +0800</pubDate><description><![CDATA[基于Airsim的sitl模拟环境配置（ubuntu 16.04）
sitl仿真，软件在环仿真可以不使用任何硬件就可以进行模拟飞行或驾驶，实验室获取数据非常有用。基于Airsim的sitl模拟需要PX4飞控架构、Airsim环境作为模拟器，控制端可以使用QG，这里没安装。

1 PX4环境的搭建
px4的指南
首先把源码复制到本地
git clone https://github.com/PX4/Firmware.git --recursive
然后安装需要的依赖
bash ./Tools/setup/ub]]></description><category></category></item><item><title><![CDATA[opencv中相机标定的残差rms]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107465904</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107465904</guid><author>jonathanzh</author><pubDate>Mon, 20 Jul 2020 16:10:38 +0800</pubDate><description><![CDATA[相机标定的残差rms

注意

求平均值时total是所有点的总数，尽管每个点包含x、y两部分的误差，但是这里的值不是点数*2
均方根误差的定义
rms = \sqrt{\frac{\Sigma_n(x^2(n))}{N}}

在相机标定函数中
retval, cameraMatrix, distCoeffs, rvecs, tvecs=cv.calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs)

通过]]></description><category></category></item><item><title><![CDATA[python序列化保存对象——pickle和json]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107382056</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107382056</guid><author>jonathanzh</author><pubDate>Thu, 16 Jul 2020 14:20:21 +0800</pubDate><description><![CDATA[使用总结：

pickle保存成二进制序列，json保存成json格式的可读文本，显然json文件可读性更强；
pickle保存的对象只能用于python，且不同版本可能不通用；
dump、load用来操作文件流，dumps、loads用来操作对象
pickle操作文件时，要以’b’二进制打开文件；
json本身有自己定义的一些数据格式，所以存储时需要确保存储对象在json中有对应的类型
json使用时参照以下的对应表，如果想要序列化的数据类型不在这些里面，则保存时会报错





json
python
]]></description><category></category></item><item><title><![CDATA[详解numpy的repeat和tile 用来复制数组]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/107369901</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/107369901</guid><author>jonathanzh</author><pubDate>Wed, 15 Jul 2020 20:41:06 +0800</pubDate><description><![CDATA[repeat和tile都可以用来复制数组的，但是有一些区别
关键区别在于repeat是对于元素的复制，tile是以整个数组为单位的 ，repeat复制时元素依次复制，注意不要用错，区别[1,1,2,2]和[1,2,1,2]
repeat
用法
np.repeat(a, repeats, axis=None)

重复复制数组a的元素，元素的定义与axis有关，axis不指定时，数组会被展开进行复制，每个元素就是一个值，指定axis时，就是aixis指定维度上的一个元素
a = np.array([[1,2],]]></description><category></category></item><item><title><![CDATA[三维重建：对极约束，基础矩阵、本质矩阵、三角化详细推导过程]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/104606880</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/104606880</guid><author>jonathanzh</author><pubDate>Mon, 02 Mar 2020 10:44:15 +0800</pubDate><description><![CDATA[对极几何
描述两个视图之间的射影几何关系，计算相机不同位置的变换关系。
对极约束

以上图为例，I1I_1I1​和I2I_2I2​是两帧图像，它们之间的相机运动关系是R,tR, tR,t。O1O_1O1​和O2O_2O2​分别是这两个位姿处的光心，设通过特征匹配等手段确定p1和p2p_1和p_2p1​和p2​是同一个特征点在两幅图像上的投影，设它为[X,Y,Z]T[X, Y, Z]^T[X,Y,Z...]]></description><category></category></item><item><title><![CDATA[opencv undistortPoints函数介绍和注意（返回数值太小）]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/104418758</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/104418758</guid><author>jonathanzh</author><pubDate>Thu, 20 Feb 2020 21:38:56 +0800</pubDate><description><![CDATA[好几次使用undistortPoints都碰到些障碍，把几个问题记录一下，我都是单目相机用
void cv::undistortPoints(InputArray src,
    OutputArray dst,
    InputArray cameraMatrix,
    InputArray distCoeffs,
    InputArray R = noArray(),
    In...]]></description><category></category></item><item><title><![CDATA[win10 opencv3.4.6+CMake3.15.3+qt5.11(MSVC)+hdf5环境配置]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/104375970</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/104375970</guid><author>jonathanzh</author><pubDate>Tue, 18 Feb 2020 15:26:37 +0800</pubDate><description><![CDATA[1 安装软件
安装QT
可以在这里下载http://download.qt.io/archive/qt/5.14/
组件根据个人电脑安装情况选MinGW、msvc的对应版本；
然后添加C:\Qt\Qt5.11.1\5.11.1\msvc2017_64\bin到系统环境变量path中；
安装cmake
下载后，安装点下一步即可，然后把路径加到path中（不加也可以）
安装hdf5
下载源码安装没成功...]]></description><category></category></item><item><title><![CDATA[vs code导入cv2时错误 ImportError: numpy.core.multiarray failed to import；使用spyder时没有错误]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/104311810</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/104311810</guid><author>jonathanzh</author><pubDate>Tue, 18 Feb 2020 13:59:18 +0800</pubDate><description><![CDATA[z在anaconda的虚拟环境下进行编程时，导入cv2，出现以下错误

ImportError: numpy.core.multiarray failed to import

但是我在spyder上使用是没有这个错误的；

尝试更新了numpy后也用；

而且python解释器的选择也对；

后来发现是启动vs code的方式不对，可能没有激活anaconda环境。

于是在Anaconda p...]]></description><category></category></item><item><title><![CDATA[python报错"utf-8 codec can't decode byte 0x"]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/84429588</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/84429588</guid><author>jonathanzh</author><pubDate>Sat, 24 Nov 2018 11:17:49 +0800</pubDate><description><![CDATA[望文生义，报错的内容就是说utf-8的编码方式不能解码0x的字节，选择正确的解码方式就可以解决。

深入些理解，可以把编码就是编成字节数据，就是二进制的东西，解码以后就是我们看懂的字符串，python里面就是unicode类型。但是打码的方式有很多，需要采用适合的方法（打码方法）才能下马。比如在文件操作时，encode就是指明文件读写时的编码方式。



具体到python中，utf-8编码的文本...]]></description><category></category></item><item><title><![CDATA[吴恩达机器学习——梯度检验]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/81813014</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/81813014</guid><author>jonathanzh</author><pubDate>Sun, 19 Aug 2018 08:47:27 +0800</pubDate><description><![CDATA[在神经网络反向传播讲解过程中，提到了个梯度检验的小技巧，用于检验反向传播求解的梯度是否正确。

原理就是偏导数可以写为双侧差分形式，即



其中是个很小的数，它的值太小可能会使计算出问题，值太大则这个偏导近似是不准确的，课程中建议设置为，遍历求解代价函数对所有所有的偏导，与采用高级方法求解的值比较，差值相对很小时，可认为梯度求解正确。

注意：这个步骤只用于检测梯度求解是否正确，在验证后，要将这...]]></description><category></category></item><item><title><![CDATA[吴恩达机器学习——正规方程]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/81610164</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/81610164</guid><author>jonathanzh</author><pubDate>Sun, 12 Aug 2018 20:32:10 +0800</pubDate><description><![CDATA[Normal Equation：

线性回归中需要采用梯度下降法求解最优的，实际上可以采用解析的方法直接求解



其中



在octave中可用pinv函数求逆，在矩阵不可逆或者不为方阵时，他也能得到想要的答案。python的scipy库中有类似函数。

适用条件：

1. 特征数目少，一般在10000以下认为正规方程更有优势。...]]></description><category></category></item><item><title><![CDATA[寻优算法——梯度下降法、牛顿法原理认识]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/81543367</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/81543367</guid><author>jonathanzh</author><pubDate>Thu, 09 Aug 2018 21:01:53 +0800</pubDate><description><![CDATA[梯度下降法、牛顿法早就知道，怎么使用也很简单，但一直没搞太明白，为什么“梯度方向就是下降最快的方向”？什么站在山顶往下走只是结果，根本没解释原因，这次终于搞清楚了，写下来以防忘记。

梯度下降法

对于一个函数，可能是一维或者多维的变量，给一个增量使它的值变小，要使在这一步变得最小，即下降最快，根据泰勒展开



这里舍去二阶导数后面的小量，那么要取得最小的值，就要使最小，向量的内积



当且仅...]]></description><category></category></item><item><title><![CDATA[python3爬虫下载网页上的pdf]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/78630587</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/78630587</guid><author>jonathanzh</author><pubDate>Sat, 25 Nov 2017 11:43:13 +0800</pubDate><description><![CDATA[# coding = UTF-8
# 爬取大学nlp课程的教学pdf文档课件  http://ccl.pku.edu.cn/alcourse/nlp/

import urllib.request
import re
import os

# open the url and read
def getHtml(url):
    page = urllib.request.urlopen(url)]]></description><category></category></item><item><title><![CDATA[python的matplotlib使用]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/78570192</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/78570192</guid><author>jonathanzh</author><pubDate>Sat, 18 Nov 2017 18:03:27 +0800</pubDate><description><![CDATA[subplot(111,...):
111分别对应行数、列数、第几个，用于一次绘图时绘出多个子图，如223表示把绘图区分成四部分，在第二行第一个小区域绘制当前图，按照先行后列表示顺序。]]></description><category></category></item><item><title><![CDATA[numpy使用（argsort）]]></title><link>https://blog.youkuaiyun.com/jonathanzh/article/details/78503081</link><guid>https://blog.youkuaiyun.com/jonathanzh/article/details/78503081</guid><author>jonathanzh</author><pubDate>Fri, 10 Nov 2017 20:24:56 +0800</pubDate><description><![CDATA[最近用机器学习实战这本书学python，结果第一个算法kNN的代码就把我看蒙了，把些东西记下。
导入numpy模块，import numpy （as ny）和from numpy import *，都能导入，但是作用域不同，第二种用法下文程序默认在numpy下，如a=ny.array(...)，第二种就可以写为a=array(...)


numpy的数组ndarray，某一维度叫轴axi]]></description><category></category></item></channel></rss>