我有以下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循环来加速。?
答案 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