rhx0820的LaTeX与Beamer实践——图片、分栏与配色
主要是一些备忘录性质的东西,方便以后查找。(为什么PKU Overleaf还没修好)
Emojis on $\LaTeX$
\usepackage{emoji}
\emoji{hot-face}
需要使用LuaLaTeX进行渲染,效果好但用时长
单Frame多页Beamer
\begin{frame}[allowframebreaks]{yourtitlehere}
强制换页使用\newpage
2024.2.19: 应为\framebreak
, \newpage
会破坏Beamer的格式。
插入视频
本来应该使用media9
宏包的,但是宏包似乎调用flash老兄弟,老家伙离开我们好多年了,所以只能想bypass的方法。
\href{path/to/image}{\includegraphics[width=(yourfloatwidth)\textwidth]{path/to/video}}
自己手动创建缩略图,添加超链接,这样兼容性似乎也比media9
好。
你说得对,但是Manga Time Kirara是一款由芳文社……
取了经典发色红蓝黄粉的一个低饱和度版本 #E55260 #A4C2F4 #F1D268 #FA9CB4,我们萌豚是这样的。
以thwfhk/PKU-Beamer-Theme为例,Beamer文档的主题颜色是由beamercolorthemecustompku.sty
定义的,可以在其中修改。
尝试使用配色器。以某一颜色PKU(#94070A)为主色,可以用配色器生成所需其他颜色的调色板。
to be continued
cmh的期末大作业随想
cmh程序设计 期末大作业
概述
对n by n个三维格点进行积分,实际上是一个五层的循环,在第三层以后加上#pragma omp for collapse(3) reduction(+, sum)
其实就有尚可的效率了。
注意到每个三维格点的数据只集中在以分布函数的截断长度r为半径,以对应三维空间的点为球心的球中,我们只需要对这一部分(或者是2r by 2r by 2r的一个盒子)的格点进行积分。这是一个很强的优化。
只考虑效率因素,不是很必要使用MPI。
困难
并行的设计本身不是难点,难点在于ScaLAPACK的使用。
可以参考的是一个Github项目:ScaLAPACK Example。名义上是C++项目,实际上除了输入输出外,几乎都是C代码。把他改成一个并行加速的对角化函数(C语言)留作练习(雾)。
ScaLAPACK函数相关的文档,我找到的最好的是IBM Parallel ESSL的文档,里面给出了详细的参数解释和样例。
Netlib的文档基本上约等于没有,文档写在注释里面,并且非常难读,我也没有找到示例。ScaLAPACK是一个Fortran 77库,类似函数的功能叫subroutine
。Fortran的传参都是实参,对应C/C++都是指针,在函数内部就可以对传入参数进行修改。这一点在调用参数时需要注意。
先说这些,可能以后聊聊Fortran吧(不要让我真的写Fortran 77代码)。
(被正态了,悲)
(更不动了)某冠以原神之名的程序课程杂记
序言
不玩原神老师是一位很负责,编程功底(从非科班的角度来看)也很强的老师。但是有一个问题:他太强了,从写代码时候敲键盘的速度就可见一斑。课后问老师助教问题的人很多,不敢问的则更多。于是有了写这个东西的想法,不敢说给老师作注,就当是我学习过程的杂记吧。这门课比我码力高强得多的人也大有人在,还请老师助教(如果他们看到了的话)和各位大佬多多批评指正。
Bash脚本
不谈这个,老师的幻灯片提供了很好的讲解。在此基础之上,没有必要系统学习bash,用到时候搜索就好。
From C to C++ (before C++11?)
why c++
- 主流,网络资源较多,从c过渡相对容易
- 性能比纯手写没有优化的Python组件高
- 支持面向对象
drawbacks
- 短时间掌握面向对象还是比较困难,并且面向对象对于很多计算任务来说包袱太重了
- c++缺少好用的包管理,使用外部库比较繁琐
至于fortran,老东西爆金币吧
类与对象踩坑合集
不同于bash,c++面向对象部分边写边搜是十分耗费精力的,建议还是稍稍系统地学一下。下面仅提及一些比较重要的特性和比较隐蔽的问题。
如果要选课学c++,大部分人第一个会想到程设(程序设计实习)。这门课在屑课颇多的信科确实算是值得跨院系选的课,不过这门课迭代版本软设已经来了,会增加c++11以后的新特性训练(看了一眼他们的上机题,有比较多的分量是讲lambda表达式等特性的),不急的话等这门课成熟了也好。
构造函数、重载赋值与浅拷贝
当你的对象里分配了动态内存的时候,一个往往让初学者很头疼的问题是:我的赋值,复制相关的功能总是报错。是的,你遇到了臭名昭著的浅拷贝问题。
在没有定义复制构造函数,并且没有重载赋值运算符的时候,c++调用默认的会默认直接进行指针的赋值,而不会复制内存空间。因此,我们需要实现自己的赋值和复制构造函数。
不要以为不赋值就可以避开问题,c++在函数调用和返回时会自动调用复制构造函数,这是隐式的,很容易忽略,个人认为也是短短的几节课很难覆盖的问题。
class demo
{
char *p;
int size;
public:
demo(const demo &d)
{
p = new char[size];
for(/* range */) // 赋值……
}
demo &operator=(const demo &d)
{
if (!p) delete[] p;
p = new char[size];
for(/* range */) // 赋值……
return *this;
}
};
这里,函数的调用和返回类型可以理解为一种约定俗成的规范,重载赋值这样写是为了保证demo
对象的赋值和c++基本数据类型的赋值行为一致。
const限定符
举个例子
// 在上面的demo类里面补上成员函数len(),返回size的值。
int demo::len()
{
return demo.size;
}
bool cmp(const demo &d1, const demo &d2)
{
return d1.len() < d2.len()
}
这样会遇到问题!
test.cpp:32:13: error: 'this' argument to member function 'len' has type 'const demo', but function is not marked const
cout << d1.len() < d2.len();
^~
test.cpp:25:9: note: 'len' declared here
int len()
^
解决方法:
int demo::len() const
{
return demo.size;
}
简单地加一个const
就可以。
MPI编程记录
MPI传递结构体
如若写C/C++有一定封装的结构体(特别是结构体数组),在MPI中需要做一些处理。
- 不要使用任何变长容器(
vector
, stack
, std::string
),因为在定义MPI结构体时每个数据的大小需要确定;请使用C数组(type_t[]
)。 - 对于传递类,我的习惯是先定义一个结构体,仅包含类内的所有数据,内部不含任何变长容器,然后按照传结构体的方式传递。创建一个结构体数组,储存原来对象容器的所有内容,然后传递这个结构体数组。
示例代码:
// tbd
资料卡
私货:我为什么推荐Arch系发行版
其实初用起来,Arch和一般发行版没什么特殊区别。个人用Arch系(WSL是Arch,实机是Manjaro)的主要原因是AUR(Archlinux User Repository)。与内置的pacman
, apt
源不同,AUR源是用户上传的,把一些二进制/Github项目/多个软件的集合打包成一个包,便于管理(安装/卸载)。上课有讲过从源码编译安装openblas
,而在AUR上被简化成yay -S openblas-git
,会自动编译、安装、添加到路径。
// tbd