2D convolution in matlab function    C = convolve_slow(A,B)
(file name is accordingly convolve_slow.m ) 
This routine performs convolution between an image A and a mask B.

Input:      A - a grayscale image (values in [0,255]) 
                    B - a grayscale image (values in [0,255]) serves as a mask in the convolution. 
Output:     C - a grayscale image (values in [0,255]) - the output of the convolution. 
                          C is the same size as A.

Method:  Convolve A with mask B using zero padding. Assume the origin of B is at 
         floor(size(B)/2)+1. 
         Do NOT use matlab convolution routines (conv,conv2,filter2 etc). 
         Make the routine as efficient as possible: Restrict usage of for loops which 
         are expensive (use matrix multiplications and matlab routines such as dot etc). &lt;br&gt;
         To simplify and reduce ifs, you should pad the image with zeros before starting your convolution loop. 
         Do not assume the size of A nor B (B might actually be larger than A sometimes).


here is my solution for this exercise. please elaborate on any change you have done or suggesting since i'm new to matlab and image processing.

function [ C ] = convolve_slow( A,B )&lt;br&gt;
%This routine performs convolution between an image A and a mask B.
%
% Input:      A - a grayscale image (values in [0,255]) 
%             B - a grayscale image (values in [0,255]) serves as a mask in the convolution.
% Output:     C - a grayscale image (values in [0,255]) - the output of the    convolution. 
%             C is the same size as A.
% 
% Method:  Convolve A with mask B using zero padding. Assume the origin of B is at floor(size(B)/2)+1. 

% init C to size A with zeros
C = zeros(size(A));

% make b xy-reflection and vector
vectB = reshape(flipdim(flipdim(B,1),2)' ,[] , 1);

% padding A with zeros
paddedA = padarray(A, [floor(size(B,1)/2) floor(size(B,2)/2)]);

% Loop over A matrix:
for i = 1:size(A,1)
    for j = 1:size(A,2)
        startAi = i;
        finishAi = i + size(B,1) - 1;
        startAj = j;
        finishAj = j + size(B,2) - 1;
        vectPaddedA = reshape(paddedA(startAi :finishAi,startAj:finishAj)',1,[]);
        C(i,j) = vectPaddedA* vectB;
    end
end

end
Rather than making four variables just to index the matrix, I would go for two in such a way:

paddedA(i :i_end,j:j_end)