如何在 MATLAB 中向量化双 for 循环?
How to vectorize double for loop in MATLAB?
我有一个代码可以将 4 个相邻值平均到具有双循环的元素中,我想对其进行矢量化我该如何实现?
for i=2:99
for j=2:99
T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4; %adjacent units avarage
end
end
这是您的代码的矢量化版本:
T1(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;
以下代码示例验证矢量化代码给出与循环相同的结果:
T0 = imresize(im2double(imread('cameraman.tif')), [100, 100]); %Read image - used as input for the test.
T1 = T0;
for i=2:99
for j=2:99
T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4; %adjacent units avarage
end
end
T2 = T0;
T2(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;
disp(['Maximum difference = ', num2str(max(abs(T1(:) - T2(:))))]);
使用 imfilter (or conv2):
您的代码相当于 Daniel 提到的 T0
和 [0,1,0;1,0,1;0,1,0]./4
的卷积。
边距结果不同 - 我用 T0
.
的边距替换了边距
%Filter kernel:
h = [0 1 0
1 0 1
0 1 0]/4;
T3 = imfilter(T0, h);
T4 = T0;
T4(2:end-1, 2:end-1) = T3(2:end-1, 2:end-1); %Fix the margins.
disp(['Maximum T4 difference = ', num2str(max(abs(T1(:) - T4(:))))]);
我有一个代码可以将 4 个相邻值平均到具有双循环的元素中,我想对其进行矢量化我该如何实现?
for i=2:99
for j=2:99
T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4; %adjacent units avarage
end
end
这是您的代码的矢量化版本:
T1(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;
以下代码示例验证矢量化代码给出与循环相同的结果:
T0 = imresize(im2double(imread('cameraman.tif')), [100, 100]); %Read image - used as input for the test.
T1 = T0;
for i=2:99
for j=2:99
T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4; %adjacent units avarage
end
end
T2 = T0;
T2(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;
disp(['Maximum difference = ', num2str(max(abs(T1(:) - T2(:))))]);
使用 imfilter (or conv2):
您的代码相当于 Daniel 提到的 T0
和 [0,1,0;1,0,1;0,1,0]./4
的卷积。
边距结果不同 - 我用 T0
.
%Filter kernel:
h = [0 1 0
1 0 1
0 1 0]/4;
T3 = imfilter(T0, h);
T4 = T0;
T4(2:end-1, 2:end-1) = T3(2:end-1, 2:end-1); %Fix the margins.
disp(['Maximum T4 difference = ', num2str(max(abs(T1(:) - T4(:))))]);