Matlab中,我想提高运算速度,请问怎样才能把下面的for循环转换成矩阵运算来提高速度? m=0

Matlab中,我想提高运算速度,请问怎样才能把下面的for循环转换成矩阵运算来提高速度?
m=0;
for i=1:46847
for t=1:46847
m=m+strncmp(R2new1{1,t}R1new1{1,i},5);
end

end
m
其中R2new1和R1new1中存的是字符串,长度也比较长。本程序的目的是找单元阵列R2new1和R1new1中相同字符串的对数。

m=0;
for i=1:46847
tf=strncmp(R2new1,R1new1{1,i},5);
m=m+sum(tf);
end

这里是两重循环,每个循环的数据量都比较大
完全转为矩阵运算是个很大的二维矩阵,占据内存比较大
所以还保留一层循环,将内层循环变成矩阵运算追问

这样处理后是能快些。您的意思是转换成二维矩阵后运算起来也会很慢是吧?

追答

matlab的指令是解析运行的,

也就是一边将代码翻译为计算机语言一边运行
一句矩阵运算的指令只需要解析一次
而循环中每次运行同一个指令,每次都要解析一次
这就是为什么用矩阵运算会比循环快

但矩阵运算也有缺点,就是用的内存多一些,因为要记录整个矩阵计算的结果
实际上是用空间去换时间

因为你是要比较 R2new1和R1new1中每一个配对
所以总共需要比较46847*46847次

你原来的代码用两层46847次的循环来完成46847*46847次的比较
除了R2new1和R1new1这两原有的数据外

就用了i,t,m三个变量,几乎可以说没有用额外的存储空间

我的代码增加了一个tf变量,起码增加了一个长度是46847的逻辑矩阵的储存空间
用一句代码tf=strncmp(R2new1,R1new1{1,i},5); 比较了46847次
代替原来的内层循环,省了4万多次解析语句的时间

如果要完全用矩阵办法去完成比较,
那么你需要构造两个46847*46847的矩阵去存放原来的数据
还要有一个46847*46847的逻辑矩阵存放结果
假如一个46847*46847只占1个字节,粗略估计这样一个矩阵需要约2G的内存
实际没一个数据还需要不止一个字节的储存空间
所以需要的内存空间还需要提高几倍,这不是一般计算机配置能够承受的

再换句话,假如能有这么多内存给你用
但是向系统要求分配内存和内存的读写些也是需要时间的

由于我的电脑没有这么大的内存,所以没有办法测试
全部矩阵化会不会比部分矩阵化更快
但这里我认为只化简一层循环比较实际

追问

嗯嗯。那是不是用c语言写的for更快些?相同的循环次数?

追答

其实即便是用矩阵运算,最终到计算机运行的时候也是用循环实现的

假如a是10个数的矩阵
在matlab里面你用
b=a;
就可得到和a相等的矩阵b

当然你可以写成循环
for i=1:10
b(i)=a(i);
end

而c语言则是
for(i=0;i<10;i++)b[i]=a[i];

c语言的命令是要运行是要事先编译的,成为机器码之后运行

而matlab的 b=a,运行时候首先要解析,
然后实际上内部也生成和c语言类似的循环结构机器码

实际上,这时候matlab和c语言的效率相差不大

但在matlab里面写循环,那么循环每次遇到 b(i)=a(i);
都要再解析。生成机器码运行,随着循环次数的增加,其效率就大大低于
矩阵语句和c语言

c语言是更低级的语言,也就是更接近机器的语言,其效率比较高
但它要所有语句编译后形成exe文件才能运行,

而matlab的优势在于可以一行一行的命令运行,每行都可以看到结果
比较方便调试

在某些时候,可以用多语言联合编程
例如可以将大量循环操作的代码用c语言编写编译,形成包装好的链接库函数
那么在matlab运行的时候,也可以直接调用这些链接库函数,提供运行效率

追问

谢谢了!看来我得看一下混合编程

温馨提示:答案为网友推荐,仅供参考
相似回答