I have a simple matrix I: I = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15; 16,17,18,19,20; 21,22,23,24,25] My kernel is: k = [0,0,0; 1,0,-1; 0,0,0] I would like to compute for the non-boundary elements. For each element, I want to compute its left neighbour - its right neighbour,i.e.: dIx = [~,~,~,~,~; ~,6-8,7-9,8-10,~; ~,11-13,12-14,13-15,~; ~,16-18,17-19,18-20,~; ~,~,~,~,~] I used this line to achieve this: dIx = conv2(I,k,'valid'); This gives me the result: dIx = [0,0,0,0; 0,2,2,2; 0,2,2,2; 0,2,2,2] which is the opposite sign of what I expected. Why is the case?
Neeta Dsouza answered .
2025-11-20
Remember that a convolution does not slide k over I, but rather a pre-flipped version of k. You can compensate for this by doing,
k = [0,0,0;
1,0,-1;
0,0,0]
k=fliplr(flipud(k));
dIx = conv2(I,k,'valid');
although for the kernel you've shown this pre-flip happens to be equivalent to k=-k.