提高Matlab函数的性能

时间:2012-10-19 15:11:14

标签: performance matlab math matrix vectorization

我想改进一个简单的matlab函数。 有没有算术方法来实现这个功能?我认为这会表现得更好。

function img_output = cutchannels(img_input, min, max)
[r c l] = size(img_input);
img_output = double(img_input);

for i = 1:r
    for j = 1:c
        for k = 1:l
            if(img_output(i:j:k)> max)
                img_output(i:j:k) = max;
            elseif(img_output(i:j:k) < min)
                img_output(i:j:k) = min;
            end
        end
    end
end
end

2 个答案:

答案 0 :(得分:6)

如果我理解正确,这就是你想要做的事情

function img_output = cutchannels(img_input, min, max)

img_output = double(img_input);
img_output(img_output>max) = max;
img_output(img_output<min) = min;

end

首先,我认为您的索引存在错误:img_output(i:j:k)实际上应该读取img_output(i,j,k) - 这是索引3D数组的方法。

以上是在MATLAB(read about it here)中使用逻辑索引的标准方法。声明

img_output>max

返回大小等于img_output大小的0/1数组,其中img_output中大于max的所有元素均为1.您可以将此矩阵用作img_output

中的索引
img_output(img_output>max)

这只选择逻辑索引等于1的img_output条目。然后可以为它们分配任何你想要的值

img_output(img_output>max) = max

或作为附注,对它们进行任何其他操作,例如

img_output(img_output>max) = img_output(img_output>max).^2;

答案 1 :(得分:2)

你可以做得更短:

function img = cutchannels(img, min_val, max_val)
    img = min( max(double(img),min_val), max_val );
end

这引出了一个问题,为什么你想要在一个函数中实现它(例如,为什么不在你需要的任何地方使用这个单行?)

作为建议:minmax是内置Matlab函数的名称。尽管是合法的,但将它们用作变量名称也是不好的做法。例如,

是什么
M = max(max, 5)

是什么意思,当max是变量名时?您是将max变量编入索引,还是将max函数编入索引,并将变量max作为输入?这对你和Matlab的解析器都很困惑。建议:使用其他变量名称,例如minimummaximum,如上面的函数所示。