什么是高质量的代码
...
MATLAB 调用 Cpp 动态库
C/C++的动态库几乎可以被所有其它语言正常调用,MATLAB也不例外,这里简单记录一下MATLAB调用C++动态库的做法。 首先,我们简单创建一个动态库,由于我们的实验环境是Windows+MSVC,需要注意动态库的符号导出问题,动态库包括头文件demo.h和源文件demo.cpp demo.h12345678910111213#pragma once#ifdef MY_EXPORTS#define MY_API __declspec(dllexport)#else#define MY_API __declspec(dllimport)#endifextern "C" {MY_API int add(int a, int b);MY_API double multiply(double a, double b);} demo.cpp123456#define MY_EXPORTS#include "demo.h"int add(int a, int b) { return a + b;...
Euler方程组的Riemann问题精确解
Euler方程组是典型的双曲守恒律方程组,对于Euler方程组的一些记号和基本结论以及针对双曲守恒律问题的分析见前文。 Riemann问题是为探究双曲守恒律模型的间断问题所设置的模型,我们考虑一维Euler方程组的Riemann问题精确解求解。 \[ \begin{aligned} \begin{pmatrix} \rho \\ \rho u \\ E \end{pmatrix}_t + \begin{pmatrix} \rho u \\ \rho u^2 + p \\ u(E + p) \end{pmatrix}_x = 0,\,\,\, E = \frac12 \rho u^2 + \frac{p}{\gamma-1} \end{aligned} \] Riemann问题介绍 对于无界计算区域 \(x \in \mathbb{R}\),Riemann问题指的是初值在\(x=0\)两侧取不同的常数值,在\(x=0\)存在一个间断,即 \[ \mathbf{U}(x,0) = \left\{ \begin{aligned} &\mathbf{U}_l, x <...
USTC LaTeX 通过 Git 使用
USTC LaTeX 是主要支持在线使用的LaTeX平台,基于Overelaf开源版进行的开发,直接支持通过Git仓库同步的功能。 使用Git仓库时,我们可以利用本地的代码编辑器,这比使用浏览器上的编辑器要方便得多,因此记录一下对应的做法。 首先,从网站获取Git仓库链接,通常形如https://latex.ustc.edu.cn/git/xxxxxxx.git,主分支名称为master(这个似乎不可以修改)。 然后将其克隆到本地,并且重新取一个仓库名,例如 1git clone https://latex.ustc.edu.cn/git/xxxxxxx.git latex_test 由于项目的文件在平台上随时有可能被更改,在本地仓库对代码进行修改之后,远程推送很可能会出现推送失败的情况,对应的处理措施如下: 第一步,我们需要使用其它分支指向本地仓库的最新版本(确保本地的修改不会丢失) 第二步,执行如下命令,确保本地仓库与远程仓库的主分支最新版本保持一致 123git fetch --allgit reset --hard origin/mastergit...
MATLAB 并行计算
整理一下关于MATLAB并行计算的内容,主要是Parallel Computing Toolbox工具包的内容,本文内容暂不涉及集群层面的并行,也不涉及GPU的使用。 parfor 将for循环改成parfor循环是最简单直接的并行方式,它会启动不同的进程/线程来同步执行循环,这对循环中的内容有一定的要求: 每次迭代相互独立,结果不依赖于其他迭代 不支持某些动态操作变量的函数,如 eval 和 assignin 循环次数必须明确,不能依赖于运行时的计算结果 不支持嵌套的parfor循环 对于简单的循环体,可以尝试直接用矢量化的语法,因为parfor在启动和结束过程中也会带来额外的时间成本。 在parfor循环体内部,变量被大致分为如下几类: 循环变量,对它的限制是在循环内不能对循环变量再次赋值,并且不要在循环体外部再次使用,因为并行会导致无法确定循环变量的具体值 1234parfor i = 1:n i = i + 1; % not allowed a(i) =...
Git 使用规范
...
Python 命令行参数解析
Python经常被用来写一下简化操作的脚本,并且要求脚本支持一定的选项,有必要整理一下Python命令行参数解析的用法。 Python自带的argparse模块功能已经非常强大,使用非常便捷。 Python其实还有另外两个模块可以完成同样的任务:getopt和optparse,但是前者过于简单,后者已经被弃用,目前只推荐使用argparse。 与之形成鲜明对比的是,C/C++对这种基础的需求通常都是直接手写的,或者去下载一些第三方提供的纯头文件库,为这种简单的任务引入外部依赖其实也并不合算,不如直接自己写了。 极简例子 从最简单的例子开始 test.py123import argparseparser = argparse.ArgumentParser()parser.parse_args() 这两行的含义为:设置一个参数解析器,解析参数。 直接运行脚本,无事发生 1python test.py 空的参数解析器为我们提供了--help(-h)参数,可以打印使用帮助,例如 1python test.py -h 输出形如 1234usage: test.py...
MATLAB 函数参数检查
为了得到健壮的代码,我们非常有必要对函数的参数进行检查,除了最基础的参数个数,还需要关注参数的类型和数据范围等,下面介绍几个MATLAB提供的用于参数检查的内置函数。 validateattributes validateattributes函数可以为我们检查某个具体参数的类型以及是否满足某些要求,不满足要求会抛出错误。 假设我们有一个函数func1,它接受两个输入参数a和b,我们要求:a是一个非空的标量,b是一个非空的向量。 1234567function result = func1(a, b) validateattributes(a, {'numeric'}, {'nonempty', 'scalar'}); validateattributes(b, {'numeric'}, {'nonempty', 'vector'}); result = a +...