所以,我正在尝试优化我制作的程序,并且我在探查器的帮助下找到了两个明显的低效率:
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的替代方案,那会更有效吗? 没有办法减少这些行被调用的次数。
答案 0 :(得分:2)
根据呼叫计数,这些可能在循环内。 min
和max
都是矢量化的(它们适用于矢量矢量)。
由于您希望沿第三维找到极值,您可以使用:
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)
重命名您的i
和j
。
这些名称对MATLAB有意义,每次看到它们都必须检查你是否有自己的定义,或者它们是sqrt(-1)
。
答案 3 :(得分:0)
第一部分可以使用bsxfun
进行无循环。
m = min(image_arr,[],3);
image_arr = bsxfun(@minus, image_arr, m.*(m>0.1));