iMatlab

爱学习,爱Matlab

2015年6月英国T4学生签证申请小攻略

本人北京的Ph.D学生一枚,学校资助半年的经费出国交流,自己补齐另外半年的钱,准备去英国交流学习一年。在这博客里记录下自己办签证的历程,供给大家参考。自己会不断更新补充的。

先附上我的材料清单,可以和别人的清单相互对照,补充。

♦我的材料清单

  1. 在线申请表   (签名处写中文,日期顺序:日月年)

  2. 护照和复印件(首页和各签证页都复印)

  3. 签证照片    (注意尺寸要求)

  4. 肺结核证明(原件+复印件)

  5. CAS(打印)

  6. ATAS(打印)

  7. unconditional offer(打印)

  8. 学位证(原件+复印件+翻译件)

  9. 本科和博士阶段成绩单(学校开据的原件及英文件,复印件)

  10. 雅思成绩(原价+复印件)

  11. 存款证明 (原价+复印件)

  12. 存折+复印件+翻译件 (复印件不太清楚,去复印店试试)

  13. 学校开据的英文资助证明(原件+复印件,里边也证明了自己是在读博士身份,说明学校资助多少钱)

  14. 预约确认信

  15. 支付确认信(打印的邮件)

  16. IHS号码(Immigration health surcharge邮件里有,超过六个月的人就得交)


♦关于ATAS

有些同学需要申请ATAS,需不需要自己查下吧。建议早点申请,ATAS一般需要20个工作日能下来,早点申请避免出现什么差错。

我在还没拿到CAS时试着申请了下,在2015年5月26号左右申请,在6月18日邮件收到,不过5.26提交的的课程名写的有点问题。我在28号和6.1号左右又提交了两次,稍后我会更新收到的时间。也希望其他人看到能留言给我,跟大家分享下时间。

更新:28号左右申请的也是三周左右下来了,但是6.1号左右申请的现在30天了还没下来,说明也不一定保险。


♦关于肺结核证明

我去的是北京港澳国际医务诊所,因为它家一出地铁就能到,感觉很方便,就选了它,大家可以酌情选择去哪家诊所。去之前最好电话预约下,我不知道预约是否是必须的,但是至少我去的港澳诊所是这么要求的。我预约的就是第二天的,还问了她们几点人少,她们告诉我一点左右,我去了还真就没什么人,

要带的东西有:护照,护照首页复印件,2寸照片2张,另外最好提前知道自己地址和留英时的地址(都需要英文的,填表用),还需要知道自己要办的签证类型,这个也是填表用。

到了诊所门口会有人接待,她会告诉你怎么做,基本上流程就是:

填表---客服人员打印出表格让你核对---让你交钱,550元人民币(刷卡现金都行)---带您检查,胸透---有个医生会跟你核对下信息,并问问你有没有病史--如果没有问题的话,最后他们会把一张证明制作好直接交给你。

整个流程很快,很easy。照片现场照的费用好像是30元吧,还是自己照了吧,别费钱了,我感觉550就给我检查个肺结核她们都够暴利了,大家还是别给诊所送钱了

【OMNet++安装前】Java环境的安装和配置

转自如下博客:

http://www.cnblogs.com/linjiqin/archive/2013/11/02/3403095.html


win7+jdk环境变量配置

进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-6u12-windows-i586-p.exe

2、安装jdk-6u12-windows-i586-p.exe,我安装在D:\dev\Java\jdk1.6.0_12\目录下

3、配置环境变量:右击“我的电脑”-->"高级"-->"环境变量"

1)在系统变量里新建JAVA_HOME变量,变量值为:D:\dev\Java\jdk1.6.0_12\(根据自己的安装路径填写)

2)新建classpath变量,在path变量(已存在不用新建)添加变量值,变量值为:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

3)在path变量(已存在不用新建)添加变量值:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注意变量值之间用“;”隔开)

eg、.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

4、测试是否配置成功
在dos中,输入命令java,回车后应该会出现java的各种命令;
javac  出现相关编译的命令;
java -version 出现jdk版本号

补充环境变量的解析:
JAVA_HOME:jdk的安装路径

classpath:java加载类路径,只有类在classpath中java命令才能识别,在路径前加了个"."表示当前路径。

path:系统在任何路径下都可以识别java,javac命令。


ipad Actions软件电脑客户端下载地址


软件介绍如下贴,我就不费劲介绍功能了,好不好用用自己试试。

http://digi.tech.qq.com/a/20130118/000399.htm

ipad actions软件电脑客户端下载地址

http://yunpan.cn/QUgvXeSicSqNm

【转】C++产生随机数(应用rand函数)



苦逼而快乐的程序猿。

<一>

C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
(1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。
例如:

#include<stdio.h>
#include<stdlib.h>
void main()
{
       for(int i=0;i<10;i+)
             printf("%d/n",rand());
}

(2)  如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:

例如:随机生成10个0~100的数:
#include<stdio.h>
#include<stdlib.h>
#define random(x) (rand()%x)

void main()
{
     for(int x=0;x<10;x++)
           printf("%d/n",random(100));
}

 

(3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。

srand()函数定义 : void srand (unsigned int seed); 
通常可以利用geypid()或time(0)的返回值来当做seed
如果你用time(0)的话,要加入头文件#include<time.h>

例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)

void main()
{

     srand((int)time(0));
     for(int x=0;x<10;x++)
           printf("%d/n",random(100));
}

这样两次运行的结果就会不一样了!!



matlab中的scatter函数(可画散点图)

scatter Scatter/bubble plot.

    scatter(X,Y,S,C) displays colored circles at the locations specified

    by the vectors X and Y (which must be the same size).  

 

    S determines the area of each marker (in points^2). S can be a

    vector the same length a X and Y or a scalar. If S is a scalar, 

    MATLAB draws all the markers the same size. If S is empty, the

    default size is used.

    

    C determines the colors of the markers. When C is a vector the

    same length as X and Y, the values in C are linearly mapped

    to the colors in the current colormap. When C is a

    length(X)-by-3 matrix, it directly specifies the colors of the  

    markers as RGB values. C can also be a color string. See ColorSpec.

 

    scatter(X,Y) draws the markers in the default size and color.

    scatter(X,Y)是个典型的用法,画散点图。后面有离子,可以设置相关的颜色,点的形状。

    scatter(X,Y,S) draws the markers at the specified sizes (S)

    with a single color. This type of graph is also known as

    a bubble plot.

    scatter(...,M) uses the marker M instead of 'o'.

    可以在后边填上所绘点的类型,不一定非是圆形的点。

    scatter(...,'filled') fills the markers.

    加入filled可以让图中的点变成实心点。

    scatter(AX,...) plots into AX instead of GCA.

 

    H = scatter(...) returns handles to the scatter objects created.

 

    Use PLOT for single color, single marker size scatter plots.

 

    Example

tx=[1.0;14.0;3.0;21.0;9.0;22.0;10.0;3.0;27.0;20.0;18.0];

ty=[7.0;3.0;19.0;18.0;33.0;3.0;11.0;32.0;27.0;12.0;34.0];

scatter(tx,ty,'filled','r');

hold on

kx=[4.40;4.87;0.63;8.26;4.29;8.24;3.17;0.94;11.23;6.82;5.58];

ky=[5.55;1.14;6.20;5.84;10.34;0.49;3.88;10.89;9.20;4.29;10.62];

scatter(kx,ky,'b','*');



matlab中的any函数(the function of "any" in matlab)

any   True if any element of a vector is a nonzero number or is logical 1 (TRUE).  any ignores entries that are NaN (Not a Number).

   any函数是用来判断向量中是否含有非零数或者是逻辑1的,但是any函数        会忽略那些不是数字的项。

    For vectors, any(V) returns logical 1 (TRUE) if any of the elements of the vector is a nonzero number or is logical 1 (TRUE). Otherwise it returns logical 0 (FALSE).  For matrices, any(X) operates on the columns of X, returning a row vector of logical 1's and 0's.  For multi-dimensional arrays, any(X) operates on the first non-singleton dimension.

    对于向量V来说,any(V)在向量中含有非零元素或者逻辑1时会返回逻辑变量1,否则会返回逻辑0。对于矩阵X来说,any(X)对矩阵X的列进行操作,并返回一个含有逻辑1或者0元素的行向量。对于多位的数组,any(X)则在其第一个维度上进行操作。 

    any(X,DIM) works down the dimension DIM.  For example, any(X,1)  works down the first dimension (the rows) of X.

any(X,DIM)则在DIM维(一个表示维度的数字)上进行操作,例如any(X,1)在X的行向量上进行判断。


matlab中repmat函数用法坚毅说明

repmat

repmat 即 Replicate Matrix ,复制和平铺矩阵,是 MATLAB 里面的一个函数。

1语法

B = repmat(A,m,n)

B = repmat(A,[m n])

B = repmat(A,[m n p...])


2实例


一、B = repmat(A,m,n)

将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, (size(A,2)*n] 。

>> A = [1,2;3,4]

A =

1 2

3 4

>> B = repmat(A,2,3)

B =

1 2 1 2 1 2

3 4 3 4 3 4

1 2 1 2 1 2

3 4 3 4 3 4


二、B = repmat(A,[m n])

与 B = repmat(A,m,n) 用法一致。


三、B = repmat(A,[m n p...])

B 是由 m×n×p×… 个 A 平铺而成的高维数组。B 的维数是 [size(A,1)*m, size(A,2)*n, size(A,3)*p, ...] 。

>> A = eye(2,2)

A =

1 0

0 1

>> B = repmat(A,[2 3 2])

B(:,:,1) =

1 0 1 0 1 0

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1

B(:,:,2) =

1 0 1 0 1 0

0 1 0 1 0 1

1 0 1 0 1 0

0 1 0 1 0 1


如何在Linux下用gdb调试程序

用GDB调试程序


一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。


  • 启动GDB

      通常启gdb的方法是

       gdb  programname

          programname也就是你的执行文件名


  • 调试中的常用命令

        下面我们来了解一些常用的gdb调试命令吧!






C++ vector容器类型及初始化方法

http://www.cnblogs.com/charley_yang/archive/2010/1

看到一篇很好的学习的vector虚容器的博文,分享给大家,感谢博主,对我帮助很大!!


vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  :

#include <vector>

使用vector有两种不同的形式,即所谓的数组习惯和 STL习惯。

一、数组习惯用法

1. 定义一个已知长度的 vector :

vector< int > ivec( 10 );  //类似数组定义int ia[ 10 ];

可以通过ivec[索引号] 来访问元素

使用 if ( ivec.empty() ) 判断是否是空,ivec.size()判断元素个数。

 

2. vector的元素被初始化为与其类型相关的缺省值:算术和指针类型的缺省值是 0,对于class 类型,缺省值可通过调用这类的缺省构造函数获得,我们还可以为每个元素提供一个显式的初始值来完成初始化,例如  
vector< int > ivec( 10, -1 ); 
定义了 ivec 它包含十个int型的元素 每个元素都被初始化为-1 

对于内置数组 我们可以显式地把数组的元素初始化为一组常量值,例如 : 
int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };


我们不能用同样的方法显式地初始化 vector ,但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现,例如:  
// 把 ia 的 6 个元素拷贝到 ivec 中 
vector< int > ivec( ia, ia+6 );  


被传递给ivec 的两个指针标记了用来初始化对象的值的范围,第二个指针总是指向要拷贝的末元素的下一位置,标记出来的元素范围也可以是数组的一个子集,例如 :

// 拷贝 3 个元素 ia[2], ia[3], ia[4] 
vector< int > ivec( &ia[ 2 ], &ia[ 5 ] );


3. 与内置数组不同 vector 可以被另一个 vector 初始化 或被赋给另一个 vector 例如  
vector< string > svec; 
void init_and_assign() 

    // 用另一个 vector 初始化一个 vector
    vector< string > user_names( svec ); 
    // ... 
 
    // 把一个 vector 拷贝给另一个 vector
    svec = user_names; 
}

 

二、STL习惯用法

在 STL9中对vector 的习惯用法完全不同。我们不是定义一个已知大小的 vector,而是定义一个空 vector  
vector< string > text;


1. 我们向 vector 中插入元素,而不再是索引元素,以及向元素赋值,例如 push_back()操作,就是在 vector 的后面插入一个元素下面的 while 循环从标准输入读入一个字符串序列并每次将一个字符串插入到 vector 中  
string word; 
while ( cin >> word ) { 
text.push_back( word ); 
// ... 
}

虽然我们仍可以用下标操作符来迭代访问元素  
cout << "words read are: \n"; 
 
for ( int ix = 0; ix < text.size(); ++ix ) 
      cout << text[ ix ] << ' '; 
 
cout << endl; 
但是 更典型的做法是使用 vector 操作集中的begin()和 end()所返回的迭代器 iterator  
对 :
cout << "words read are: \n"; 
 
for ( vector<string>::iterator it = text.begin(); 
    it != text.end(); ++it ) 
           cout << *it << ' '; 
 
cout << endl
iterator 是标准库中的类,它具有指针的功能 


*it; 
对迭代器解引用,并访问其指向的实际对象  
++it;

向前移动迭代器 it 使其指向下一个元素  

2. 注意 不要混用这两种习惯用法, 例如,下面的定义  
vector< int > ivec; 
定义了一个空vector 再写这样的语句  
ivec[ 0 ] = 1024; 
就是错误的 ,因为 ivec 还没有第一个元素,我们只能索引 vector 中已经存在的元素 size()操作返回 vector 包含的元素的个数 。

3. 类似地 当我们用一个给定的大小定义一个 vector 时,例如  :
vector<int> ia( 10 ); 
任何一个插入操作都将增加vector 的大小,而不是覆盖掉某个现有的元素,这看起来好像是很显然的,但是 下面的错误在初学者中并不少见 :
const int size = 7; 
int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 }; 
vector< int > ivec( size ); 
 
for ( int ix = 0; ix < size; ++ix ) 
    ivec.push_back( ia[ ix ]); 
程序结束时ivec 包含 14 个元素, ia 的元素从第八个元素开始插入。


linux g++“段错误 (核心已转储) ”一种可能原因及其解决方法


我在编写程序c++程序时定义几个很大的数组,都是约为1000*1000维,之所以定义的这么大是因为我想编写的程序要将一块空间划分为很细小的网格,我用这些大数组存储这些网格图心的坐标及该图心点的权值。比如:

  1. int row_n=(int)ceil(allnodes.squareL/gridlength);       

  2. int col_n=row_n;    

  3.   

  4. float centroid_x[row_n][col_n];   

  5. float centroid_y[row_n][col_n];  

   row_n值为1000;


   终端在运行的时候总是出现

“段错误 (核心已转储) ”

   

    在Eclipse中出现如下错误

Thread [1] 6201 [core: 1] (Suspended : Signal : SIGSEGV:Segmentation fault)  main() at 1028.cc:131 0x8049483

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂   


      我的代码都是很简单的代码,也没用到指针什么的复杂的东西,怎么会出现这种问题呢?

   我们可以参看些关于段错误的知识:

   段错误主要原因是:

   1)访问系统数据区,尤其是往系统保护的内存地址写数据 ,最常见就是给一个指针以0地址 

   2)内存越界(数组越界,变量类型不一致等)

   3) 访问到不属于你的内存区域  

   那么看来我可能会出现数组越界的问题了!!

       那么在看些关于数组越界的背景吧(抱歉,小猴啥也不懂,找问题就得一点点点看,这里贴出自己是怎么找到问题所在的)

     http://blog.csdn.net/wind19/article/details/5964137

    看了帖子,对堆栈的概念加深了些了解,也有些启示,个人觉得我错误原因是这样的:

      栈空间用来存储数组等数据,那么段错误就应该是我存储的数组超过了它所在段的大小,于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示(SIGSEGV: Segmentation fault)。

     linux下应用  ulimit -a 命令查看当前栈空间大小,得到:

     8012   

     即我的系统下栈空间应该为8M,而可以自己算下自己定义的数组大小,发现我的数组每个大概3M多,而我的数组个数也大于3个,我的gdb中调试的过程中也恰巧是在第三个大维数数组那出现的问题,我的数组的确越过了stack段的边界,出现了错误。

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂


     如何解决这个问题呢?

     我用

ulimit -s  102400

     将栈的大小改为100M(这回可够用了),然后运行程序或者debug,程序就能正确运行了。

    我在其他人的帖子里看见一些人说用vector容器可能会更好,自己还没有去深入学习,这是我下一步个工作吧,今天先把怎么解决这个问题的过程帖子这里。希望可以和大家交流下关于段错误的问题。

   解决问题中看到的一些觉得还不错的帖子:

   http://www.cs.ucsb.edu/~pconrad/cs16/10W/extraLabs/el01/  

   http://stackoverflow.com/questions/2346806/what-is-segmentation-fault

    http://www.linuxidc.com/Linux/2011-03/32874.htm

   

    

  

   

     



linux下ceil圆整函数的用法

在matlab中有向上圆整的函数ceil,同样在g++中也有ceil函数,通过man查询其在linux下的用法如下:

CEIL(3)                    Linux Programmer's Manual                   CEIL(3)


NAME

       ceil, ceilf, ceill - ceiling function: smallest integral value not less   than argument


SYNOPSIS

       #include <math.h>


       double ceil(double x);

       float ceilf(float x);

       long double ceill(long double x);


       Link with -lm.


举个例子吧:

#include <stdio.h>

int main()

{int x1;

float y1=5.4;

  x1=ceil(y1);

printf("x=%d",x1);


用法就是这么简单,大家可以实践下。


LINUX下C++函数用法大全【不断更新,欢迎补充】

小猴说:为了自己方便学习linux下的c++编程,也帮助自己区分开matlab和c++的一些不同点,我会在这个博客中不断更新我所碰到的一些c++函数,会尽量配着matlab对应于c++的函数来说。

一、A开头类

 

二、B开头类

三、C开头类

1、ceil圆整函数

Linux下C++语言与Win下的一点不同(关于INFINITY的定义)

我有一个判断点是否在多边形内部的的程序,在VS2012下编译通过了,运行正确,但是放到g++里就报错了,错误如下:

在一行里出现了这些错误,比如这个错误

invalid pure specifier (only ‘= 0’ is allowed) before ‘;’ token


找到源程序,怎么看也看部出来什么错误。




后来一看到说关于变量初始化啊,specifier方面有错误,想起来g++下无论是include的头文件啊还是一些其他的定义都有很多不同,通过man命令查看INFINITY发现是有定义的,不能再赋值了,只需要换一个变量名就可以解决这个问题了。g++下要注意的细节很多,大家编程时要仔细啊,把我的错误分享给大家了,希望对有类似问题的同学有帮助。





MATLAB中矩阵的嵌套

偶然发现了别人的仿真中一段精妙的代码(哈哈,这个不分享了,变量定义了好多,不方便大家阅读),查找它的原理,分享给大家。

Using Logicals in Array Indexing
A logical array index designates(指定了) the elements of an array A based on their position in the indexing array, B, not their value. In this masking type of operation, every true element in the indexing array is treated as a positional index into the array being accessed.

In the following example, B is a matrix of logical ones and zeros. The position of these elements in B determines which elements of A are designated by the expression A(B):
A = [1 2 3; 4 5 6; 7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9


B = logical([0 1 0; 1 0 1; 0 0 1]);
B =
     0     1     0
     1     0     1
     0     0     1


C=A(B)

=  4

     2

     6
     9

得出的结果C是一个列向量。

很多人看见两个这种一个矩阵套在另一个矩阵的形式后就觉得不对,其实这种形式是存在的,但是注意B是类型,是一个逻辑变量构成的矩阵。

来源:爱兰松