当前位置: 代码迷 >> 综合 >> Matlab 效率优化问题
  详细解决方案

Matlab 效率优化问题

热度:52   发布时间:2023-10-24 09:48:05.0
一直以为使用matlab自带的函数要比自己编写的函数更加高效,毕竟感觉一个团队研发出来的东西应该要比我这种可以仅仅算是使用了一年matlab而且没有其他编程语言背景的菜鸟要高大上很多,但是在多次的项目优化尝试后发现,有些时候代码量少未必就是写得好、效率高,matlab自带的简便函数有些时候就未必有自己编写的函数速度快,以下列举一些简单的自己常会用到的语句可以优化的地方:
1.合并和查找:众所周知,提前预设一个变量的范围往往要比我们后期改变该变量大小会省很多时间,这里就不加以阐述。一般我们想要合并两个同类型矩阵的数据时选择行合并和列合并都直接用[a;b] ,或若是我们需要从一个矩阵中找到我们想要的部分B=A(A(:,2)==code,:);当矩阵过大或是运行次数过多时,以上两种做法会非常耗时,建议采用定位法,如合并的时候可用
c(1:length(a),:)=a;  c(length(a)+1:length(b)+length(a),:)=b; 查找的时候可以事先确定好位置序号:
[name,xuhao,~]=unique(A(:,2));
xuhao(length(name)+1)=size(A,1)+1;% 为最后一个代码找到终点值
pos=find(name==code); % 只需要从小集合name中查找所要找的代码的位置;
B=A(xuhao(pos):xuhao(pos+1)-1,:);%定位提取


2.ismember、intersect等集合函数功能非常强大, 用着也很方便,但是若是在我们的程序在需要多次遍历使用,在重复次数多的情况下非常耗时间,经过尝试发现他们其实可以被all、find、any
等函数替代,效果奇佳,举个例子:
如判别元素x是否在A中ismember(x,A)==1,在重复千万遍后远比any(A==x)==1要慢上近似百倍
intersect可以用这些函数自己编写,效果也比自带的要好很多,代码如下
function c=ainb(a,b)
if isempty(a)==1&&isempty(b)==1
    c=[];
    return;
end
if length(a)>length(b)
    d=a;
    a=b;
    b=d;
end
c=nan(length(a),1);%%提前预设
l=1;
for i=1:length(a)
    if any(b==a(i))
      c(l)=a(i);
      l=l+1;
     end
end
c(isnan(c)==1,)=[];


看似写的代码多了,但其实效率会高很多,追求速度的朋友可以看下,也欢迎有更多解决matlab中优化问题的建议;
  相关解决方案