【问题标题】:Improve Performance of Matlab Function提高 Matlab 函数的性能
【发布时间】:2012-10-19 15:11:14
【问题描述】:

我想改进我的一个简单的 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

【问题讨论】:

  • 为什么每次迭代都查找img_output(i:j:k)?这很奇怪。如果您访问img_output(i,j,k) 会更有意义。 for 循环可能完全没有必要。
  • 因为我不想检查图像中的每个像素值是否高于最大值或低于最小值。
  • 您没有检查图像中的每个像素。
  • -1:这个问题我没发现什么好消息,现在比刚开始看的时候更郁闷了。
  • 这些答案对您有用吗?

标签: performance matlab math matrix vectorization


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

    你可以做得更短:

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

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

    作为忠告:min 和 max 是 Matlab 内置函数的名称。虽然合法,但将它们也用作变量名也是不好的做法。例如,什么

    M = max(max, 5)
    

    意思是,当max 是变量名时?您是在索引max 变量,还是调用max 函数,并将max 变量作为输入?这让您以及 Matlab 的解析器感到困惑。建议:使用其他变量名称,如minimum 或maximum,如上面的函数。

    【讨论】:

      猜你喜欢
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      相关资源
      最近更新 更多