在matlab中优化DP

时间:2016-10-23 11:08:12

标签: matlab image-processing optimization dynamic-programming

我有以下DP,我在Matlab中应用于二值化图像(0或1)

[x, y] = size(img);
dp = zeros(x, y);
dp(1,:) = img(1,:);
dp(:,1) = img(:,1);
for i = 2:x
    for j = 2:y
        if img(i, j) == 0
            dp(i, j) = min([dp(i, j - 1), dp(i - 1, j), dp(i - 1, j - 1)]) + 1;
        end
    end
end

大x和y的代码需要花费大量时间,因为if条件并使用for循环而不是编写矢量化代码。

任何人都可以优化它。 或者是否有任何方法通过利用矩阵img包含0或1(少于0的1)的事实来优化上述代码。 也可以以某种方式使用并行for循环来加速。?

1 个答案:

答案 0 :(得分:2)

据我所知,你通常不能真正加速这个计算。但是,如果您知道只有极少数条目,img(i,j)==0以下方法可能会为您节省一些时间:

[x, y] = size(img);
dp = zeros(x, y);
dp(1,:) = img(1,:);
dp(:,1) = img(:,1);
[i, j] = find(img(2:end, 2:end) == 0); % Extract only these pixels where we actually need to do something
i = i + 1; %correct for removing the first row and column
j = j + 1;
for k = 1:numel(i);
    dp(i(k), j(k)) = min([dp(i(k), j(k) - 1), dp(i(k) - 1, j(k)), dp(i(k) - 1, j(k) - 1)]) + 1;
end