Develop

Emacs的org模式下可以实现latex公式片段的预览,通过C-c C-x C-l即可实现,在官方文档中描述如下。 Produce a preview image of the LaTeX fragment at point and overlay it over the source code. If there is no fragment at point, process all fragments in the current entry (between two headlines). When called with a prefix argument, process the entire subtree. When called with two prefix arguments, or when the cursor is before the first headline, process the entire buffer. 使用C-c C-x C-l需要安装图片转换插件,有ltxpng和imagemagick两种。ltxpng仅支持转换为png图片,imagemagick与之相比支持的格式就丰富很多,这里我们选择imagemagick插件。 在Emacs的init.el中可以设置生成图片的插件,我们这里设置为imagemagick,在init.el中添加(setq org-latex-create-formula-image-program ‘imagemagick) macOS中可以通过brew来安装imagemagick,在终端中运行

brew install imagemagick

安装成功后,在org中进行C-c C-x C-l操作,发现仍不能将latex片段转换为图片,Emacs提示Can’t find ’convert‘ (You need to install imagemagick) 在终端中运行

which convert

发现convert存在于/usr/local/bin/中,而Emacs的配置是在/usr/bin/中寻找命令,我们需要在/usr/bin中创建convert的alias。当尝试更改/usr/bin/中的文件时,发现操作失败,即使使用sudo,也无法成功创建。原因是在EI Capitan后的macOS系统中为了对抗恶意程序,加入了Rootless机制,导致我们不再能够随心所欲地读写一些路径。因此,我们需要尝试关闭Rootless。 重启,按住Command+R进入恢复模式,打开Terminal,执行

csrutil disable

执行后,Rootless已经关闭。进入系统,定位到/usr/local/bin/中convert的目标文件,创建alias,命名为convert,拷贝到/usr/bin/中。此时,我们打开Emacs,在org中进行C-c C-x C-l操作,latex片段可以成功转换为图片。 最后,别忘了开启Rootless,重启,按住Command+R进入恢复模式,打开Terminal,执行下面命令即可

csrutil enable

该操作在Linux下同理

UI Modification / Dashborad State / Unit Change / Initialize Measure Latest commit 7061b56 实现: 1、进一步优化UI 2、Dashboard State逻辑 3、Unit Change逻辑 4、初始状态下的测量逻辑 下一步计划: 分离线程并考虑使用3个线程:UI线程、逻辑线程、Data Retrieval线程

  1. 在求解线性方程组时,会遇到以下几种情形:定解方程组、不定方程组、超定方程组、奇异方程组。作为示例,首先以定解线性方程组为例:

    matlab求解线性方程组

  2. 在分析如上方程组时,需要知道,方程中有3个未知数,而方程也有3个,所以可以求出(x,y,z)值,转化为矩阵即为: AX = B,其中A为系数矩阵,B为右边值向量。而X即为未知数构成的向量,转化后即为: >> A = [2,3,1; 4,2,3; 7,1,-1]; 如上为系数矩阵; >> B = [4;17;1]; 如上为右边值矩阵; 利用矩阵除法: >> X = AB 求得结果如下图红色箭头所示: x = 1.0000 ; y = -1.0000 ; z = 5.0000;

    matlab求解线性方程组

  3. 不定方程组求解 在不定方程组求解时,遇到的方程组常如下所示:

    matlab求解线性方程组

  4. 数学上分析可以知道,未知数多于方程式数目,所以解有无数个。但是,可以利用matlab求解一个特定的解(特定解),如下所示输入: >> A = [4,5,1; 1,2,4]; >> B = [3;15]; >> X = AB 可以求得一个特解,如下所示:

    matlab求解线性方程组

  5. 超定方程组求解 数学分析上可以知道,当方程数目多于未知数数目时,可以知道该方程组无法求出准确解。如下方程所示:

    matlab求解线性方程组

  6. 在求解时,如下操作即可: >> A = [4,5; 1,2; 3,1]; >> B = [3;15;12]; >> X = AB 求解输出如下图所示,需要说明时,求得结果是以一最小二乘近似解。

    matlab求解线性方程组

  7. 在求解奇异方程组,可以发现多个方程之间有重复,如下示例:

    matlab求解线性方程组

  8. 在分析时,如上述求解方式: >> A = [2,3; -4,-6]; >> B = [1;-2]; >> X = AB 那么,可以看到matlab不能求出解,如下所示:

    matlab求解线性方程组

  9. 此时,可以做同解异构,如下所示: >> A = [2,3; -4,-6; 0,0]; >> B = [1;-2;0]; >> X = AB 输出的一个特解如下所示:

    matlab求解线性方程组

p 输出曲线信息 polyfit调整次幂

x=[0.1,0.2,0.3,0.4,0.5];
y=[-2.89,-3.07,-3.24,-3.4,-3.62];
p=polyfit(x,y,1)
x1=0.:0.05:0.6;
y1=polyval(p,x1);
plot(x,y,’*r’,x1,y1,’-b’)

字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。 这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。 1. 首先,字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。 2. 因为B与A不匹配,搜索词再往后移。 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。 4. 接着比较字符串和搜索词的下一个字符,还是相同。 5. 直到字符串有一个字符,与搜索词对应的字符不相同为止。 6. 这时,最自然的反应是,将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。 7. 一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是”ABCDAB”。KMP算法的想法是,设法利用这个已知信息,不要把”搜索位置”移回已经比较过的位置,继续把它向后移,这样就提高了效率。 8. 怎么做到这一点呢?可以针对搜索词,算出一张《部分匹配表》(Partial Match Table)。这张表是如何产生的,后面再介绍,这里只要会用就可以了。 9. 已知空格与D不匹配时,前面六个字符”ABCDAB”是匹配的。查表可知,最后一个匹配字符B对应的”部分匹配值”为2,因此按照下面的公式算出向后移动的位数: _  移动位数 = 已匹配的字符数对应的部分匹配值_ 因为 6 – 2 等于4,所以将搜索词向后移动4位。 10. 因为空格与C不匹配,搜索词还要继续往后移。这时,已匹配的字符数为2(”AB”),对应的”部分匹配值”为0。所以,移动位数 = 2 – 0,结果为 2,于是将搜索词向后移2位。 11. 因为空格与A不匹配,继续后移一位。 12. 逐位比较,直到发现C与D不匹配。于是,移动位数 = 6 – 2,继续将搜索词向后移动4位。 13. 逐位比较,直到搜索词的最后一位,发现完全匹配,于是搜索完成。如果还要继续搜索(即找出全部匹配),移动位数 = 7 – 0,再将搜索词向后移动7位,这里就不再重复了。 14. 下面介绍《部分匹配表》是如何产生的。 首先,要了解两个概念:”前缀”和”后缀”。 “前缀”指除了最后一个字符以外,一个字符串的全部头部组合;”后缀”指除了第一个字符以外,一个字符串的全部尾部组合。 15. “部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。以”ABCDABD”为例, _  - ”A”的前缀和后缀都为空集,共有元素的长度为0;_ - ”AB”的前缀为[A],后缀为[B],共有元素的长度为0 - ”ABC”的前缀为[A, AB],后缀为[BC, C],共有元素的长度0 - ”ABCD”的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0 - ”ABCDA”的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为”A”,长度为1 - ”ABCDAB”的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为”AB”,长度为2 - ”ABCDABD”的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0 16. “部分匹配”的实质是,有时候,字符串头部和尾部会有重复。比如,”ABCDAB”之中有两个”AB”,那么它的”部分匹配值”就是2(”AB”的长度)。搜索词移动的时候,第一个”AB”向后移动4位(字符串长度-部分匹配值),就可以来到第二个”AB”的位置。

#include <stdio.h>

#include <string.h>
int findnext(char data[],int next[],int nkey);
int main()
{
char data[1001];
char key[1001];
memset(data,sizeof(data),’\0’);
memset(key,sizeof(key),’\0’);
int ndata,nkey,i,position;
while(scanf(“%s”,data)!=EOF)
{
position=0;
scanf(“%s”,key);
ndata=strlen(data);
nkey=strlen(key);
int next[nkey];
for(int z=0;z<nkey;z++)
next[z]=0;
findnext(key,next,nkey);
while(position<=ndata)
{
for(i=0;i<nkey;i++)
if(data[position+i]!=key[i])
break;
if(i==nkey && key[i-1]==data[position+i-1])
{
printf(“Position:%d\n”,position+1);
position=position+i-next[i-1];
}
else if (i!=0)
{
position=position+i-next[i-1];
}
else if (i==0)
position++;
}
printf(“Done!\n”);
}
}
int findnext(char data[],int next[],int nkey)
{
int pin,i,j,suc,flag;
next[0]=0;
for(pin=1;pin<nkey;pin++)
{
for(i=0;i<=pin-1;i++)
{
suc=pin-i;
flag=1;
for(j=0;j<=i;j++)
{
if(data[j]!=data[suc+j])
{
flag=0;
break;
}
}
if(flag==1)next[pin]=i+1;
}
}
return 1;
}

findnext()函数的作用为生成部分匹配表next[],在此函数中,使用变量pin来控制当前字串切片位置,suc为后缀起始点,通过suc+j来控制后缀起始点,通过j++来比对前缀和后缀的各位字符。注意:i为数组索引值,而i+1才为实际比对字符数。 KMP算法的时间复杂度为O(n)

先Copy一下什么是全错位排序:

全错位排列:即被著名数学家欧拉(Leonhard Euler,1707-1783)称为组合数论的一个妙题的“装错信封问题”。

“装错信封问题”是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-1748)的儿子丹尼尔·伯努利(DanidBernoulli,1700-1782)提出来的,大意如下:

一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?

递推公式

瑞士数学家欧拉按一般情况给出了一个递推公式:

用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作f(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:

(1)b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有f(n-2)种错装法。

(2)b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)(n-1 )份信纸b、c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有f(n-1)种。

总之在a装入B的错误之下,共有错装法f(n-2)+f(n-1)种。a装入C,装入D……的n-2种错误之下,同样都有f(n-2)+f(n-1)种错装法,因此:

f(n)=(n-1) {f(n-1)+f(n-2)}

公式可重新写成 f(n)-nf(n-1)=-[f(n-1)-(n-1)f(n-2)] (n>2)

很显然,比如在10对儿里面有3对儿排错了,3C6选出3对儿再乘以3对儿的错排可能—>AC!

#include <stdio.h>

#include <math.h>

#include <string.h>
long long int combination(int a,int b);
long long int fac(int num);
int main()
{
int m,n,e;
long long int data[21];
memset(data,sizeof(data),0);
data[1]=0;data[2]=1;data[3]=2;
for(int i=4;i<=20;i++)
data[i]=(i-1)(data[i-2]+data[i-1]);
scanf(“%d”,&e);
for(int z=1;z<=e;z++)
{
scanf(“%d%d”,&n,&m);
if(m==n)
printf(“%lld\n”,data[n]);
else
printf(“%lld\n”,combination(n,m)
data[m]);
}
return 0;
}
long long int combination(int a,int b)
{
int i,j;
long long int ans=1;
for(i=a;i>=a-b+1;i–)
ans=ansi;
return ans/fac(b);
}
long long int fac(int num)
{
int i;
long long int out=1;
for(i=1;i<=num;i++)
out=out
i;
return out;
}

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×