011 MATLAB进阶笔记:告别for循环,走向新巅峰
来源:互联网 发布:会计金蝶软件 编辑:程序博客网 时间:2024/06/13 05:54
2015-12-8
最近在参加一个数学建模比赛,关于复杂网络的( 002C语言 验证无标度网络的幂律定律、004C语言 实现小世界网络)。想到之前已经对复杂网络有所接触,这次虽不敢说胸有成竹,但至少努力了就会有所收获!
抛开题目不谈(毕竟还没多少思路),今天做了一些基本工作(毕竟现在的水平也就这速度!!),即分析网络的基本特征,即平均路径、聚类系数、度分布等。由于最近在学习MATLAB编程,这一次还是选择了MATLAB来处理(其实我也想用igraph、Pajek等听起来牛X哄哄的工具的,奈何之前没学,临时学时间有限),所以默默的坚守在了MATLAB。
由于刚刚从C语言转型到matlab,一些C语言编程的‘恶习’还是改不掉,比如不断地for loops;看看比如写无标度网络,不过这就是C语言:接近底层,大多数细节都要你自己实现。不过既然转战MATLAB了,怎么还能那么土里土气,随便一下就来个for循环,像这样:
甚至用了matlab还这样
不像话啊,今天一开始还是一直在用for循环,但考虑到这是比赛,而且数据本来就很大(其中两个社会结构的网络已经把我的电脑跑崩了),所以大刀阔斧的进行了一番改进,先贴上改完后的代码(当然也只是才写了一点点)
clc, clear ticsource = input('input filename\n');Con = load(source);%turn to matrixConNum = length(Con);%get number of connectionsConMap = unique(Con);%reset identifierConMapNum = length(ConMap);%number of nodesNewCon = zeros(ConNum, 2);<span style="color:#ff0000;">for i=1:ConMapNum NewCon(Con==ConMap(i))=i;end</span>clear Con;<span style="color:#ff0000;">Logic = NewCon(:,1)>NewCon(:,2);temp = NewCon(Logic,2);NewCon(Logic,2) = NewCon(Logic,1);NewCon(Logic,1) = temp;NewCon = sortrows(NewCon, 1);</span>clear temp;clear Logic;%test passedSpMatrix = sparse(1:ConMapNum, 1:ConMapNum, 0);%initial sparse matrix<span style="color:#ff0000;">SpMatrix(sub2ind(size(SpMatrix), NewCon(:,2),NewCon(:,1))) = 1;</span>Paths = graphallshortestpaths(SpMatrix, 'directed', false);temp = tril(Paths);temp(isnan(temp)) = 0;D = max(max(temp));%diamaterSum = sum(nonzeros(temp));L = Sum/nchoosek(ConMapNum, 2);toc在来揭露一下他们原来的熊样:
1、
for i=1:ConMapNum NewCon(Con==ConMap(i))=i;end
他们原来是这样的:
for i=1:ConNum for j=1:2 for k=1:ConMapNum if ConMap(k)==Con(i, j) NewCon(i, j) = k; end end endend这么多嵌套不忍直视!
不过神奇的matlab编辑器还提醒我继续优化,
于是最后成了这样:
for i=1:ConMapNum NewCon(Con==ConMap(i))=i;end
2、
Logic = NewCon(:,1)>NewCon(:,2);temp = NewCon(Logic,2);NewCon(Logic,2) = NewCon(Logic,1);NewCon(Logic,1) = temp;他们原来是这样的:
for i=1:ConNum if NewCon(i, 1)>NewCon(i,2) temp = NewCon(i,2); NewCon(i,2) = NewCon(i,1); NewCon(i,1) = temp; endend
SpMatrix(sub2ind(size(SpMatrix), NewCon(:,2),NewCon(:,1))) = 1;它原来是这样的:
for i=1:ConNum SpMatrix(NewCon(i,2), NewCon(i,1)) = 1;end
MATLAB甚至直接的表达了对我的鄙视:
不过之前C语言虽然复杂,但是是自己的一些内建函数的理解更加容易,比如:
SpMatrix(sub2ind(size(SpMatrix), NewCon(:,2),NewCon(:,1))) = 1;和C语言用指针p定位数组(i,j)位置为(p+i*N+j)有就很相似。
鉴于时间比较紧张,所有不对优化的具体细节及函数的解释作介绍,这部分有时间补上。
通过几个优化,避免了不少for循环,而且对于我现在处理的大型复杂网络来时,这种优化节省的时间是相当可观的,(有tic、toc为证!!)而这些函数的另也正是MATLAB的精髓之一,作为一门工具性的语言,MATLAB不善于进行for运算,也不需要进行for运算,更不应该进行过多的for运算。学语言学的因该是这门语言的核心思想,语言有多很多,自己也接触了不少(当然只是初窥门路),发现语法大底是相同的,主要是每种语言因为其目标的不同而形成的不同核心思想,就像用PHP写底层,用C语言写网站一样,显然是不科学的。。。。好像扯远了。
最后扯一句:世上有不绝的语言,愿你(是愿我)有不绝的心情,学啊学!!
- 011 MATLAB进阶笔记:告别for循环,走向新巅峰
- 告别for循环!
- for循环 进阶练习
- For循环进阶使用
- for循环写法进阶
- 告别理想主义,走向经验主义
- matlab中的for循环
- matlab for循环
- 北大告别过去,走向未来
- vi 常用命令---带你走向IT巅峰
- Matlab修改for循环次数
- Matlab的for循环优化
- matlab for循环 比较不一样
- Matlab的for循环优化
- matlab 矩阵代替for循环
- Matlab之for循环语句
- matlab-基础 for循环示例
- 9.5MATLAB for循环结构
- 开发datastage parallel routine
- 第一次使用redis看的文章(转)
- jquery根据label文本查找label元素
- 绘制像素到屏幕
- 自定义带下拉刷新和滚动加载的ListView控件原理分析和实现
- 011 MATLAB进阶笔记:告别for循环,走向新巅峰
- [129]Sum Root to Leaf Numbers
- java泛型程序设计——反射和泛型
- sublime3 JavaScript Snippets 插件快捷命令大全
- java(7)--UDP传输
- c++函数返回引用
- 接口测试的必要性
- GBK/GB2312/UTF-8区别于联系
- 数据库简单查询