Max和Min的更有效的替代方案

时间:2014-09-13 01:23:17

标签: performance matlab max min

所以,我正在尝试优化我制作的程序,并且我在探查器的帮助下找到了两个明显的低效率:

    if (min(image_arr(j,i,:)) > 0.1)
      image_arr(j,i,:) = image_arr(j,i,:) - min(image_arr(j,i,:));
    end
    %"Grounds" the data, making sure the points start close to 0

被称为4990464次,共计58.126次,占总编译时间的21.8%。

    [max_mag , max_index] = max(image_arr(j, i, :));
    %finds the maximum value and its index in the set

被称为4990464次,总计50.900s,占总编译时间的19.1%。

我可以在这里使用max和min的替代方案,那会更有效吗? 没有办法减少这些行被调用的次数。

4 个答案:

答案 0 :(得分:2)

根据呼叫计数,这些可能在循环内。 minmax都是矢量化的(它们适用于矢量矢量)。

由于您希望沿第三维找到极值,您可以使用:

image_arr = bsxfun(@minus, image_arr, min(image_arr, [], 3));

[max_mag , max_index] = max(image_arr, [], 3);

答案 1 :(得分:1)

似乎:

   if (min(image_arr(j,i,:)) > 0.1)
      image_arr(j,i,:) = image_arr(j,i,:) - min(image_arr(j,i,:));
    end

可以像这样重写:

data = image_arr(j,i,:);
mn = min(data);
if (mn > 0.1)
  image_arr(j,i,:) = data - mn;
end

这似乎是可以写成的内部循环:

minarr = min(image_arr)
[a,b] = find(minarr > 0.1);
image_arr(a,b,:) = image_arr(a,b,:) - minarr(a,b)

答案 2 :(得分:0)

重命名您的ij

这些名称对MATLAB有意义,每次看到它们都必须检查你是否有自己的定义,或者它们是sqrt(-1)

答案 3 :(得分:0)

第一部分可以使用bsxfun进行无循环。

m = min(image_arr,[],3);
image_arr = bsxfun(@minus, image_arr, m.*(m>0.1));