iMatlab

爱学习,爱Matlab

图论相关书籍PDF分享

  1. 《Graph Algorithms》- Shimon Even-Guy Even-第二版PDF版下载

    图论算法的入门书籍,感觉讲的很好,自己用到了其中流的应用的那一章节,介绍的知识很全。附上自己的百度云盘下载链接:

    http://pan.baidu.com/s/1c08u7TI




附一个uber打车的优惠码,限首次用uber打车的用户,可以免去10英磅左右的费用,注册时填入优惠码u61d28veue,uber打车应该是最便宜的了,另外对没用过uber的朋友们介绍下,uber的优惠券在账户里没法直接查看。

2015年8月英国T4学生签证申请爱尔兰旅游签证攻略总结

本人参考了蚂蜂窝上的这篇攻略:

http://www.mafengwo.cn/i/3258348.html

在这里表示感谢,并附上原文的地址,由于我是15年8月去申请的,目的地也主要为爱尔兰的高威(Galway),所以在会在原文的基础上做些改动,大家可以参照着看看。


首先附上转载的原文,后面附上我的申请建议:

【本攻略创作时间为2014年11月22日,之后签证政策有任何变动概不负责,一切以爱尔兰签证官网为准】
爱尔兰的签证可算办下来了。因为之前师姐没有去过在网上找的攻略都出入不小,加上最近签证政策变动很厉害。作为一个造福读者的良心博主,打算自己写一份攻略。虽然这个攻略的适用范围不是很广,但是是许多国家签证的标准流程,可以参考英国签证和申根签证,我本人也是将此视为一次申根签证的总演习哒~而且有英国Tier 4的中国护照办爱尔兰签证是免签证费的,这也是我去签证的主要原因~
1.进入Ireland签证官网 INIS, 全称为Irish Naturalisation and Immigration Service,Google输入Ireland visa第一个就是,了解一下申请信息什么的,当然爱尔兰驻伦敦大使馆  也可以,说实话这个网站比爱尔兰自己的做的更好。
2.注册申请系统AVATS
https://www.visas.inis.gov.ie/avats/OnlineHome.aspx
填写表格这些就不用多说了,我申请的是tourist,然后爱尔兰那边的接待人就写住宿地址
※注册成功后会给你一个Transaction number, 一定要记下来保管好,下次你再填表时就直接从网站左侧的Retrieve Application直接进了。
3.准备申请材料
https://www.dfa.ie/media/embassylondon/ourservices/Visit-Visa-Checklist-v1.2-0314.pdf
这个是伦敦爱尔兰大使馆的官方checklist,按照这个表准备准没错。下面是我最终寄出的材料:
①Signed summary 这个不用说了,填完表就会有,打印出来签好字,可双面打印
②护照及信息页复印件
③签证页复印件,签证页当然就在你护照上啦,复印件一定是要包括你来英国后盖了章的那个
④申请陈述,这个就相当于一个行程单,告诉签证官你为什么去爱尔兰你每天干什么,我的版本如下
===================================================================================
Ireland Trip Statement
Applicant: 
Application transaction No. 
Passport Number: 
Contact Number:
Email: 
Address: 
 
The reason for my visit Ireland is I want to spend part of my Christmas holiday this winter. Here is my trip itinerary.

2014.12.19 Day 1-Dublin
Morning:
Places to visit: St Stephen’s Green, Trinity College &Old Library, Dublin Writers Museum, National Museum of Ireland, Dublin Castle
To Stay at:宾馆地址,下同

2014.12.20 Day 2 – Dublin-Killarney
Morning: From Dublin to Killarney by Train
Places to visit: Killarney Town, Ross Castle
To Stay at:

2014.12.21 Day 3 – Killarney-Galway
Places to visit: Killarney National Park
Afternoon: From Killarney to Galway by coach
To Stay at:

2014.12.22 Day 4 – Galway
Places to visit: Poulnabrone Dolmen, Lisdoonvarna, Cliffs of Moher, seaside village of Doolin, Fanore Surf beach, Galway city.
To Stay at:

2014.12.23 Day 5 – Galway-Dublin
Morning: From Galway to Dublin by train
Places to visit: Guinness Storehouse, The Old Jameson Distillery, Kilmainham Gaol, Christ Church Cathedral Dublin, St Patrick’s Cathedral
To stay at: 
 
2014.12.24 Day 6 – Dublin-Manchester
Flying from Dublin to Manchester at 13:10 by Ryanair
Signature:
Date:
===================================================================================================
⑤Passport size photo这个我就交了英国签证照片,白底的。一张就够,背面不用写任何字
⑥Police registration及复印件。因为checklist要英国身份证我木有,就发邮件去问伦敦大使馆警察局注册行不行,回复说和Tier 4 visa搭配使用就可以啦,然后我就复印了一份和原件一起寄过去了。
⑦住宿预订表,我是从booking.com订的,网站上有打印键,打印前记得选语言为英文,超方便
⑧机票预订,我订的Ryanair,不用多说
⑨在读证明,带校园卡去学校的student service跟工作人员说你要visa letter,分分钟
⑩三个月银行流水Bank Statement及复印件,这个有一点麻烦,因为一开始我一直没有用在英国开的卡,是为了签证才存了一笔钱进去而且零星地有几笔数额很少的消费记录,大概离开证明时只有1个月的记录,但是签证官还是没有较真,很大方地给过了。
⑪Self-addressed special delivery envelope这个放到下面说
⑫保险单。这个不要求,但是我有而且有N多复印件,就随手塞了一张进去。
还有人把老护照也寄去了,但是我老护照没带,就没寄
【还是那句话,一切以官网为准!】
4.邮寄
虽然免签证费,但因为是邮寄申请,爱尔兰人缺乏淘宝卖家们的包邮意识,所以要去买一个Special delivery envelope,这个相当于英国的特快专递,英国境内的邮件是保证一天到的。当然邮费也是呵呵呵……我去邮局一问,来回邮费7.15*2=14.3镑,外加寄过去时放资料的大信封80p一个。反正在邮局买好上面签上你的地址就Ok了。
5.等待。我从11月3号下午寄出,到11月21号早上收到。约14个工作日,在圣诞前夕效率还是很良心的。回来的信封里就只有护照和Police Registration了,其他的不管Checklist上有没有一律照单全收。
最后,要给爱尔兰伦敦大使馆发上一朵小红花❀,因为咨询邮件基本当日回,网页清晰态度良好,工作效率高给签证大方,实在是不可多得的良心使馆!
最后,祝大家都能顺利拿到签证~


小猴楼主给出的申请建议:

  1. 时间:如果在英国邮寄申请会至少15天,在伦敦大使馆亲自送签只需要7个工作日,如果你比较着急的话可以跑一趟伦敦大使馆,本人由于要接亲人,时间很紧就跑去伦敦办的,刚好在第7个工作日查到了护照寄出的消息,第二天收到了签证。

    本人在15年10月份又申请了一次,结果15个工作日过了没有查到我的签证信息,发邮件过去问说得4周左右的时间,看来大家如果有出行计划还是早点计划好吧。

  2. 申请陈述:这里附上我的版本,由于主要去高威,可以称为高威版。

    这里附上百度云盘的下载链接。

    http://pan.baidu.com/s/1bn8wDgN

  3. 资金证明:我的英国银行卡里有五万左右的人民币,存款时间只有短短的半个月,申请时还是有点小忐忑,但是事实证明不必担心,我的签证还是顺利的下来了,只要你有存款就行,时间不到三个月没问题。

    我的银行卡是barclays巴克莱银行的,银行营业厅一般都有一个打印statement的机器,打印好了找工作人员盖章就好了,别的银行我不清楚,有了解的同学麻烦分享下。

  4. 警局注册证明材料和BRP卡好像并不是必须的,因为你有护照,护照就是你的证明材料了;机票也可以不预订;保险单也不是必须的;酒店可以选booking.com上,我找的是一个可以取消的,因为具体什么时间去我还没有确定下来。

    总体而言就是,根据大使馆提供的材料清单准备就行,原帖可能是为了更保险才准备的那么多。

  5. 附一个uber打车的优惠码,限首次用uber打车的用户,可以免去10英磅左右的费用,注册时填入优惠码u61d28veue,uber打车应该是最便宜的了,另外对没用过uber的朋友们介绍下,uber的优惠券在账户里没法直接查看。




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++下要注意的细节很多,大家编程时要仔细啊,把我的错误分享给大家了,希望对有类似问题的同学有帮助。





ubuntu12.04如何自动挂载文件夹和windows共享文件

Virtualbox虚拟机Ubuntu共享文件夹设置自动挂载



1. 安装增强功能包(Guest Additions)

安装好Ubuntu 后,运行Ubuntu并登录。然后在VirtualBox的菜单里选择"设备(D)" -> "安装增强功能(I)..."。  

您会发现在Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文档夹

/media/VBoxGuestAdditions-4.1.4

进入命令行终端,输入:

cd /media/VBoxGuestAdditions-4.1.4

sudo ./VboxLinuxAdditions.run

不同版本路径可能有所不同,请根据自己的实际情况安装

开始安装工具包,安装完毕后重启Ubuntu。

 


2. 配置共享文档夹

重启完成后点击"设备(Devices)" -> 共享文档夹(Shared Folders)菜单,添加一个共享文档夹,选项固定和临时是指该文档夹是否是持久的。共享名能够任取一个自己喜欢的,比如"gongxiang",尽量使用英文名称。



3. 挂载共享文档夹

重新进入虚拟Ubuntu,在命令行终端下输入:

sudo mkdir /mnt/shared    

sudo mount -t vboxsf gongxiang /mnt/shared

其中"gongxiang"是之前创建的共享文档夹的名字。OK,现在Ubuntu和主机能够互传文档了。

假如您不想每一次都手动挂载,能够在/etc/fstab中添加一项

gongxiang  /mnt/shared vboxsf rw,gid=username,uid=username,auto 0 0

以上的 vboxsf 是群组名称 username 是你的 用户名 就是 /home/下的文件夹名称

/mnt/shared 是挂载目录

这样就能够自动挂载了。

这里会需要用到vi编辑器对fstab文件进行编辑,小白们需要用这个略显麻烦的编辑器来编辑文档(我也是小白),找到文件所在目录,在命令行输入

sudo vi fstab

然后找到指定位置按大写I进入操作模式,其他命令你们自己查吧。对了,我的virtual box没有选择“自动加载”因为当时选了也不能自动加载,需要权限才能进入目录,后来看别人帖子说这个不用选了,要手动处理下才行。



如果不行的话就试试这个。


在文件 /etc/rc.local 中(用root用户)追加如下命令 mount -t vboxsf share /home/liuqin/mnt

OK,现在 Ubuntu 和主机可以互传 文件了。 


4. 卸载的话使用下面的命令: sudo umount -f /mnt/shared 注意: 共享文档夹的名称千万不要和挂载点的名称相同。


C++ vector容器类型【转】【可以学习下vector的初始化】

自己编程时发现vector的初始化和其他类型数据的方法不太一样,参考了下这个,还是挺有用的,分享给大家,感谢原作者。

转自:

http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html

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 的元素从第八个元素开始插入。


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是类型,是一个逻辑变量构成的矩阵。

来源:爱兰松

MATLAB面向对象编程简介(转)


Object-oriented programming(面向对象编程)应用于软件开发过程中,它是建立在对事物科 学分类和描述基础上的编程方法。采用面向对象方法可以使系统各部分各司其职、各尽所能。为编程人员敞开了一扇大门,使编程的代码更简洁、更易于维护,并且具有更强的可重用性。

      这篇文章通过实例介绍了MATLAB面向对象编程的技术。这些实例是用Matlab 7.6 开发的,即2008a。

面向对象编程的语言

      当创建应用软件时,你所要描述的类别或事物可能是实际的对象,如汽车或是一个有机体,可能是一个虚拟实体,如金融市场,也可能是信息,如一组测试结果。在面向对象的程序设计中,这些类别以“类”的概念表达。数据元素或状态表示为类的属性,而对它们的操作则作为类的方法来实现。

      对象是类的具体实例,当程序执行时,对象是基于它所属的类及在此类中定义的属性所创建的。存储在MATLAB变量中的值都属于一个类。这些值不仅包括你可能通常会考虑的对象,如时间序列或状态空间对象,也包括双精度数。

MATLAB中的类

      在MATLAB中,可以通过whos命令来查看变量的类,用此命令同时也能看到变量其它的属性。实例中包括double, char, int8, struct, and timeseries。

>> a=1;
>> str=’Hello’;
>> whos
Name Size Bytes Class Attributes
a 1x1 8 double
str 1x5 10 char

应用实例:分析传感器阵列数据

      图1中是一个传感器阵列,通常排列成直线,用来检测空气,水,或地面雷达,声纳,移动通信等信息。通过从空间多点收集时间样本,就能从采样的介质中提取更多的信息。
                图1 用传感器阵列检测未知角度的两个远距离的电磁源

      在此我们使用传感器阵列检测多个远距离的电磁源如无线导航台、雷达发射机传来的方向(DOA)。在一定的情况下,我们将设法估计这两个电磁源相对传感器阵列指向的夹角θ1和θ2。


回顾数据项目及其操作

      首先我们回顾需要表示的数据项和需要实现的操作。 

      在大多数应用中,我们必须存储并且跟踪数据,以执行需要的操作。在实例中,我们需表示以下数据:

  • 传感器和样本

  • 采样的传感器数据

  • 传感器采样率

  • 传感器间距

  • 远距离电磁源的波长

  • 波速

  • 传感器数据集合的名称或描述

      我们将使用一个简单的基于FFT技术来估计电磁源的DOA。这一技术可被分解为多个部分,可以将它看作是一系列操作的集合。例如我们首先需要进行如下的一些操作:

  • 从综合的数据或采集到的实时数据创建数据集合

  • 检查和修改数据值和参数

  • 根据样本数据绘制图形,以有助于分析和验证

  • 计算并且绘制数据集合快速傅立叶变换(周期图)的平均幅度的平方值

  • 寻找周期图的峰值以估计电磁源到来的方向

      现在我们就可以决定什么需要用类的属性去表示以及什么需要用类的方法去实现。

表示具有类属性的数据 

      我们首先定义一个类来描述传感器阵列。这些初始化的表示仅仅包括数据项目,而这些数据项目是以类的属性来表示的。

      在MATLAB中是用类定义文件来定义一个类的,类定义文件包括用关键字表示的代码模块和描述类不同属性的结束语句。图2所示就是一个定义文件,它描述了一个名为sads的类(即传感器阵列数据集合),类中包含了我们需要表示的所有数据项目,它们被列在属性模块中。



                                图2 带属性的类定义文件sads.m


创建一个对象并且访问属性

   


      用下面的语句可以创建一个对象或是我们已经定义的类的一个实例
>>s=sads;
      如果想设置属性值,我们可以像访问结构字段一样获取它的名字,并修改其属性值
>>s.NumSensors=16;
      键入对象名之后便可以查看所有可设置的属性和当前的值。
>>s
s = 
sads
properties: 
NumSensors: 16
NumSamples: [] 
Data: [] 
SampleRate: [] 
Spacing: [] 
Wavelength: [] 
c: 300000000
Name: []
list of methods

      除了NumSensors和c之外其它的属性都为空。在MATLAB基本工作空间中双击对象后,我们可以使用变量编辑器查看或编辑其属性,就像它们是结构中的字段一样(见图3)。





      此时数据集合就是类sads的一个对象,对象属性可以是isa函数、whos命令或是一些结构没有的功能。
>> class(s)
ans =
sads

      当创建代码的用户操作这些数据集合时对变量类的识别就显得很重要,因为用户需要通过类才能访问和正确地操作变量。

错误检查

      在使用结构表示数据时,可以在任何时候添加新的字段名,只要定义了新的字段名并赋上它的值就可以了。有了此功能当我们在搭建算法或在算法样板时就特别方便。但是,如果拼错了字段名称,那么便自动地添加了一个新的字段名,如果由此出了错那么很难被检测到。

      不同于结构的这种方式,在类的使用中,我们并不能简单通过定义新的属性名和它的值就能添加新的属性给对象。如果拼错了对象的属性名,MATLAB会立即识别出错误来。这种检错能力十分有用,特别是对编程环境不是很熟又在开发大的应用程序的用户。

数据访问的控制

      类给了用户很大的权限去访问其属性。例如,用户可以禁止对属性的修改,隐藏属性或是被动态地计算。在类的定义文件中用户可以通过对属性的设置控制对它的访问。

      在图2中我们通过将现有属性列表分为多个属性块的方法详述了类定义文件,每一个都有唯一的属性值:GetAccess, Constant, 及 Dependent (见图4)。


                             图4 带有属性值的类定义文件sads.m

      

     用户可以通过设置Constant属性值来禁止对属性的修改。在我们的实例中,可以设置光速c为constant。因为constant属性不会被改变,它们仅仅通过类的名字就可以被访问。
>> sads.c
ans = 
300000000

      用户如果设置SetAccess为私有则属性只能读不能写。如果设置GetAccess为私有则属性仅对方法操作可见,实例中的波长属性就可以这样设置。

      用户可以自由改变私有属性得名称或特性,而不影响对象的使用者。这种定义代码的“黑盒”方法就是封装,这样用户就不用依赖代码实现的细节,也有效防止了用户的错误修改。

      用户可以通过设置Dependent来指定属性当在调用时仅做计算。用户接着可以指定当属性被访问时自动调用的方法。详细地有关如何指定类方法可参考文章中“访问带有Get和Set方法的属性”一节。在我们的实例中,NumSensors和NumSamples属性被设置为是相互依赖的。

实现带类方法的操作

      在对象上能被执行的方法或操作在方法模块中以一列函数的形式指定。类包含不同类型的方法,每一个实现不同的目的,每一个的定义也不同。下面的内容描述了一系列不同类型的方法。

      我们给sads定义文件添加一个方法集模块,并将每个新的方法添加到这个模块中(见图5)。


图5 在MATLAB编辑器中显示的是带方法的类定义文件sads.m,其代码可隐藏,也可展开查看。


指定一个构造器方法(Constructor Method)

      在我们的实例中,为了使用户能够在创建的对象中添加参数,我们指定一个构造器方法。构造器方法通常执行数据的初始化和确认。现在我们创建的对象包含了以下内容:
>>s=sads( Data, Wavelength, SampleRate, Spacing, Name);

实现特殊应用的方法

      我们将添加几个方法以实现在数据集合上特殊应用的操作。绝大多数的方法将对象看作是输入参数(例如,obj),并通过变量来访问对象的属性(例如,obj.NumSamples),如这个方法:

function [mags,fflip]=magfft(obj, zpt)
mag=zeros(obj.NumSamples, zpt);
 ...
end

      虽然还有其它的语法要求,但是通过对象变量参考的属性有助于将它们同本地函数变量区分开来,就像上面的mag一样。

调用方法

      方法的调用同函数的调用类似,只要将对象作为输入变量其中之一即可。我们调用绘制周期图形的方法(见图6),除了对象这个输入参数外,它还需要其它的输入参数:
>>magfftplot(s,128)


                                                       图6 角度周期图形


      下面,我们调用执行估计电磁源DOA主要操作的方法
>>angles=doa(s)
angles =

-10.1642    18.9953

      DOA角度同图2中所示的峰值的方位是匹配的,也近似于在图1中所示的电磁源的真实方位,即-10度角和20度角 。

用Get和Set方法访问属性

      如前面所提到的,用户能够通过指定关联的set和get方法确认属性或实现它所依赖的属性。这里get方法是针对NumSensors属性。
Function NumSensors=get.NumSensors(obj)
     NumSensors=size(obj.Data,2)  %返回该矩阵的列数
end

      当访问属性时Get和set方法被自动调用,例如
>>N=s.NumSensors;

给重载函数指定方法

      重载使用户能够通过再次定义对象中的MATLAB函数,也可以通过使用特定名称的方法重载操作甚至是索引。在我们的实例中,包括一个重载绘图的方法,即通过大家熟悉的plot函数可视化数据集合(见图7)。
>>plot(s)


                           图7 针对传感器阵列数据集合的重载plot方法

      定制的plot方法描述了这个数据集合在绝大数适当方式下的信息。plot方法仅在对象上执行,相比路径中目录顺序的操作有更可靠的方法去控制多个同名函数中的哪一个函数被调用.


进一步开发应用

      在例子当中创建的类描述了传感器阵列数据集合,并提供了用来分析数据的几个操作,其中包括寻找主要方向的操作。我们使用类评估在不同情况下基于FFT技术的性能。

      我们使用其它的面向对象的技术可以扩展这方面的应用,例如:

  • 用继承定义已存在类的子类

  • 指定静态方法,使用户能在整体上对类定义操作

  • 使用带有参考行为的句柄类,使用户能够创建类似链接列表的数据结构或者不用拷贝就能使用大型的数据集合

  • 定义事件和监听,使我们能够监视对象的属性或动作

      这些技术使我们能够进一步定义应用中的关系和行为,从而提高了我们解决复杂问题的能力。
由于使用了面向对象的技术,增加了软件的可重用性和可维护性。

面向对象编程术语表

  • 类               类别或对象的集合

  • 类定义文件   定义了类行为的MATLAB文件

  • 方法            在对象上执行的操作

  • 对象            类的实例,存在于工作空间当中

  • 属性            与对象有关的数据或状态项目



本文翻译自:http://yunpan.cn/QbNZ7a8HcSgSX

来源:爱兰松