Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

对偶问题转化

发表于 2022-02-23 | 更新于 2022-02-24

在一个优化问题中,原始问题通常会带有很多约束条件,这样直接求解原始问题往往是很困难的,于是考虑将原始问题转化为它的对偶问题,通过求解它的对偶问题来得到原始问题的解。对偶性(Duality)是凸优化问题的核心内容。

参考链接

  1. 线性规划原问题对偶问题之间的转化,一张图带你理解,by 中南自动化学院“智能控制与优化决策“至渝.
  2. 简易解说拉格朗日对偶(Lagrange duality),by 90Zeng.
  3. 拉格朗日对偶性,by Eureka.
  4. 【凸优化笔记6】-拉格朗日对偶(Lagrange duality)、KKT条件,by Lauer.
  5. 拉格朗日对偶性(Lagrance duality) 推导与简单理解,by 小鹅鹅.
  6. 拉格朗日对偶性,by 井底蛙蛙呱呱呱.
  7. 拉格朗日对偶,by Frostime.
  8. 优化方法:原问题和拉格朗日对偶问题(primal-dual),by 俎志昂.
  9. 拉格朗日对偶详解,by CodeAntenna.

最大似然估计

发表于 2022-02-22

在统计学中,最大似然估计(英语:Maximum Likelihood Estimation,简作MLE),也称极大似然估计,是用来估计一个概率模型的参数的一种方法。

$$ \begin{aligned} \ln p(x_i|\mu,\sigma) = \ln \frac{1}{\sqrt{2\pi} \sigma} \exp \left{ - \frac{(x_i-\mu)^2}{2\sigma^2} \right} \ = \left{ - \frac{(x_i-\mu)^2}{2\sigma^2} - \ln \sigma - \ln \sqrt{2\pi} \right} \end{aligned} ​$$

参考链接

  1. 最大似然估计,by wikipedia.
  2. 一文搞懂极大似然估计,by 忆臻.
  3. 高斯分布微分熵的推导,by 机器学习的小学生.
  4. 高斯分布的极大似然估计,by Yemiekai.

QT5中文乱码解决方法

发表于 2022-02-21 | 更新于 2024-08-03

问题产生

常用设置窗口标题方式:

1
2
3
4
window.setWindowTitle("中文") 

QString title = "中文"
window.setWindowTitle(title);

使用上述方式设置窗口标题将产生乱码。

原因分析

字符编码不匹配导致乱码现象。

1
2
3
4
5
6
7
8
9
10
11
12
/* 源码版本5.12 */
void QWindowsWindow::setWindowTitle(const QString &title)
{
setWindowTitle_sys(QWindowsWindow::formatWindowTitle(title));
}

/* 源码版本5.12 */
void QWindowsBaseWindow::setWindowTitle_sys(const QString &title)
{
qCDebug(lcQpaWindows) << __FUNCTION__ << this << window() << title;
SetWindowText(handle(), reinterpret_cast<const wchar_t *>(title.utf16()));
}

从源码可以看出title.utf16()最终转换为utf16字符编码。

解决方案

1
2
3
QString::fromUtf16(u"中文");

QString::fromLocal8Bit("中文");

参考链接

  1. QT 中文乱码解决汇总(包括QString与string、char*互转乱码),by 高祥xiang.
  2. 源码分析Qt窗口标题中文乱码的问题,by Qt君.

QT多线程及其与GUI组件的通信

发表于 2022-02-21

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

QT线程创建方法

QThread使用方法1——重写run()函数

对于使用Qthread创建的进程而言,run()函数则是新线程的入口,run()函数退出,意味着线程的终止。

QThread使用方法2——moveToThread()

如果不想每执行一种任务就自定义一个新线程,那么可以自定义用于完成任务的类,并让它们继承自QObject。

然后使用moveToThread()将QObject对象实例移动到新线程。注意moveToThread()是QObject的公有函数。移动之后启动子线程。

多线程与GUI组件的通信

GUI系统的设计原则:所有界面组件的创建只能在GUI线程(主线程)中完成。子线程与界面组件的通信有两种方式:

  • 信号槽方式
  • 发送自定事件方式

参考链接

  1. 深入理解QT多线程编程,by 编程宝库.
  2. 零基础学 qt4 编程,by wd007.
  3. 多线程与界面组件的通信,by 程序员ITS401.
  4. QT从入门到入土(五(1))——多线程(QThread),by 唯有自己强大.

QT事件处理函数被触发两次的问题

发表于 2022-02-19 | 更新于 2022-02-21

如果用官方的写法on_btn_pressed()可以不用写connect函数,可以直接触发槽函数。如果此时用connect再次连接的话,就会导致on_btn_pressed()被执行两次。

Qt信号-槽连接函数原型如下:

1
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection )

Qt支持5种连接方式

  • Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)

当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
当信号发射时,槽函数将直接被调用。
无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。

  • Qt::QueuedConnection(队列方式)(此时信号被塞到事件队列里,信号与槽函数关系类似于消息通信,异步执行)

当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
当控制权回到接收者所依附线程的事件循环时,槽函数被调用。
槽函数在接收者所依附线程执行。

  • Qt::AutoConnection(自动方式)

Qt的默认连接方式,如果信号的发出和接收信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与队列方式相同。
如果信号在接收者所依附的线程内发射,则等同于直接连接
如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接

  • Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁)

槽函数的调用情形和Queued Connection相同,不同的是当前的线程会阻塞住,直到槽函数返回。

  • Qt::UniqueConnection

与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。

参考链接

  1. QT按钮被触发两次的问题,by 不二侬.
  2. QVariant的用法,by 十年之少.
  3. QT入门系列(4):QString与int相互转换方法,by 李奕锋.
  4. 深入理解QT多线程编程,by 编程宝库.
  5. 在Qt(C++)中使用QThread实现多线程,by 星夜之夏.
  6. Q_OBJECT宏的作用,by 沈子恒.

VS2017+QT5.8.0时,新建GUI应用程序编译报错的问题

发表于 2022-02-19 | 更新于 2022-07-20

使用VS2017+QT5.8.0时,报如下错误:

1
2
严重性	代码	说明	项目	文件	行	禁止显示状态
错误 C3615 constexpr 函数 "QAlgorithmsPrivate::qt_builtin_ctz" 不会生成常数表达式 (编译源文件 BaitLaunchingstrategy.cpp) Simulation d:\qt\qt5.8.0\5.8\msvc2015_64\include\qtcore\qalgorithms.h 593

解决方法请参考VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝。

参考链接

  1. 使用VS2017+QT5.8.0时,新建GUI应用程序,编译报错的问题解决,by 麻辣鸡丝GIS.
  2. VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝,by 程序员宝宝.

极大极小算法

发表于 2022-02-13

Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。

1
2
3
4
5
6
7
8
9
10
11
12
function minimax(node, depth)
if node is a terminal node or depth = 0
return the heuristic value of node
if the adversary is to play at node
let α := +∞
foreach child of node
α := min(α, minimax(child, depth-1))
else {we are to play at node}
let α := -∞
foreach child of node
α := max(α, minimax(child, depth-1))
return α

参考链接

  1. 一张图读懂极大极小搜索和α-β剪枝,by housong_csdn.
  2. 极小化极大算法,by wikipedia.

VSCode中Python调试方法

发表于 2022-01-28

Python代码中设置了arg paser,需要手动设置,VS code的debug没有简单的添加参数的方式,需要创建launch.json文件配置调试参数,具体方法见vscode 调试python代码时添加参数(args)。

参考链接

  1. vscode 调试python代码时添加参数(args),by zk0272.

Python函数参数与注释

发表于 2022-01-28 | 更新于 2024-01-09

Python函数参数

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

以及调用函数时如何传入可变参数和关键字参数的语法:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3));

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’: 2})。

Python函数注释

  • Google风格
1
2
3
4
5
6
7
8
9
10
11
12
13
"""
This is a groups style docs.

Parameters:
param1 - this is the first param
param2 - this is a second param

Returns:
This is a description of what is returned

Raises:
KeyError - raises an exception
"""
  • Rest风格
1
2
3
4
5
6
7
8
"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

参考链接

  1. 函数的参数,by 廖雪峰.
  2. Python3 - 6种方法拼接合并列表(list),by Mediumcn.
  3. python函数注释,by 戴思达.

Python多版本管理工具pyenv

发表于 2022-01-25 | 更新于 2022-05-25

pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源.

pyenv 让您可以轻松地在多个 Python 版本之间切换。它简单、不显眼,并且遵循 UNIX 的传统,即做好一件事的单一用途工具。

安装方法

获得pyenv

  • 通过pip获取pyenv,对已安装python的用户:

    • Powershell or Git Bash: pip install pyenv-win –target $HOME\.pyenv
    • cmd.exe: pip install pyenv-win –target %USERPROFILE%.pyenv
  • 直接下载pyenv-win的zip压缩包

  • 通过Git

    • Powershell or Git Bash: git clone https://github.com/pyenv-win/pyenv-win.git “$HOME/.pyenv”
    • cmd.exe: git clone https://github.com/pyenv-win/pyenv-win.git “%USERPROFILE%.pyenv”

安装pyenv

在linux操作系统中:

1
2
wget  https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer
bash pyenv-installer

使用命令leafpad .bashrc打开.bashrc文件,在其末尾输入如下内容:

1
2
3
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

完成安装

  1. 添加PYENV, PYENV_HOME, PYENV_ROOT三个环境变量。
  2. 将pyenv-win所在路径添加到PATH环境变量。
  3. 使用命令 pyenv –version 查看pyenv版本。
  4. 在 %USERPROFILE% 目录运行命令 pyenv rehash。
  5. 运行 pyenv 查看使用方法。

使用方法

安装python解释器

1
2
3
4
5
6
7
8
9
10
# No module named '_ctypes'解决方法
sudo apt-get install -y libffi-devel
sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
#
pyenv install 3.7.3 # 安装 python
pyenv versions # 查看本机安装版本
pyenv install --list # 查看可安装版本

# pyenv install build failed:Fatal: You must get working getaddrinfo() function
PYTHON_CONFIGURE_OPTS="--disable-ipv6" proxychains pyenv install 3.9.6

卸载python解释器

1
pyenv uninstall 2.7.3 # 卸载 python

Python 切换

切换全局或者项目中的 Python 版本:

1
2
pyenv global 2.7.3  # 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
pyenv local 2.7.3 # 设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。

寻找 python 的时候优先级:

1
shell > local > global
1
2
3
4
5
pyenv shell 2.7.3 # 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。`--unset` 参数可以用于取消当前 shell 设定的版本。

pyenv shell --unset

pyenv rehash # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

安装卸载python包

1
2
3
4
pip freeze > requirement #导出依赖包
pip install -r requirement #安装依赖包
pip install -r requirement --proxy localhost:8080 # 通过代理服务安装依赖包
pip uninstall -r requirement #卸载所有依赖包

创建虚拟环境

venv

venv是python从3.3版本开始自带的虚拟环境,它的很多操作都和 virtualenv 类似,但是两者运行机制不同。要在 python2 上使用虚拟环境,依然要利用 virtualenv。

1
2
3
python -m venv env
.\env\Scripts\activate
deactivate

virtualenv

virtualenv 是目前最流行的 Python 虚拟环境配置工具。它不仅同时支持 Python2 和 Python3,而且可以为每个虚拟环境指定 Python 解释器,并选择不继承基础版本的包。

1
2
3
4
5
pip install virtualenv
pyenv exec virtualenv myproject
cd myproject
.\env\Scripts\activate
deactivate

参考链接

  1. Python多版本管理工具–pyenv,by tigeriaf.
  2. Python版本管理神器-pyenv,by 安阳.
  3. pyenv,by pyenv.
  4. pyenv for Windows,by pyenv-win.
  5. Windows环境下的Python环境搭建,by 魏晓蕾.
  6. 使用 pyenv 管理 Python 版本,by Ein Verne.
  7. Windows平台Python安装与配置教程,by jackhuang.
  8. Pipenv最新一代Python项目环境与依赖管理工具,by jackhuang.
  9. 一文解读 virtualenv & venv & pipenv 之间的联系与区别,by I’m George.
  10. 什么时候-e,–editable选项对pip安装有用,by qastack.
  11. 1. 让PIP源使用国内镜像,提升下载速度和安装成功率。,by dotohi.
  12. pip install –proxy,by pip homepage.
  13. 花了两天,终于把 Python 的 setup.py 给整明白了,by 王炳明.
  14. pyenv install build failed:Fatal: You must get working getaddrinfo() function.,by Honcy Ye.
  15. python虚拟环境管理工具venv教程,by Yunfeng.
  16. Python3.7.0以上版本安装pip报错ModuleNotFoundError: No module named ‘_ctypes’解决方法,by bro丶默默.
上一页1…171819…53下一页

Jack Huang

521 日志
67 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse