Asked by Sonny Sood
on 27 Jul 2013

Basically, i want to scan a small matrix over bigger matrix and then compare it's elements one by one for greater or less than bigger matrix.The comparison can be done in either way through column or through row.

Answer by per isakson
on 27 Jul 2013

Edited by per isakson
on 28 Jul 2013

Not by looping, however try

%% a=[1,2;3,4]; b=[1,5,6;4,0,8;11,12,0]; %% sza = size( a ); is_greater_equal = ( a >= b(1:sza(1),1:sza(2)) )

it returns

is_greater_equal = 1 0 0 1

and to find the indicies

>> [ixr,ixc]=find(is_greater_equal) ixr = 1 2 ixc = 1 2

Sonny Sood
on 28 Jul 2013

per isakson
on 28 Jul 2013

Something like this might do it?

sza = ... for ii = 1 : ... for jj = 1 : ... is_greater_equal = ( a(1:sza(1),1:sza(2)) >= b(ii:sza(1),jj:sza(2)) ) ... end end

Log in to comment.

Answer by Image Analyst
on 28 Jul 2013

Please explain what you're trying to do, rather than how you want to solve it. Because I'm thinking that normalized cross correlation (with function normxcorr2) will help you but I'm not really sure what you want to do. And don't just say you want to scan a large matrix with a small one, say **WHY** you want to do that so we know whether to recommend normxcorr2() or blockproc(), or if you really need nested looping.

Sonny Sood
on 29 Jul 2013

Image Analyst
on 29 Jul 2013

Try normalized cross correlation - it does exactly that. See this demo where I applied it to a color image to find a small color subimage inside the larger color image:

% Demo to use normxcorr2 to find a template (a white onion) % in a larger image (of a pile of vegetables) clc; % Clear the command window. close all; % Close all figures (except those of imtool.) imtool close all; % Close all imtool figures. clear; % Erase all existing variables. workspace; % Make sure the workspace panel is showing. format long g; format compact; fontSize = 11;

% Check that user has the Image Processing Toolbox installed. hasIPT = license('test', 'image_toolbox'); if ~hasIPT % User does not have the toolbox installed. message = sprintf('Sorry, but you do not seem to have the Image Processing Toolbox.\nDo you want to try to continue anyway?'); reply = questdlg(message, 'Toolbox missing', 'Yes', 'No', 'Yes'); if strcmpi(reply, 'No') % User said No, so exit. return; end end

% Read in a standard MATLAB color demo image. folder = fullfile(matlabroot, '\toolbox\images\imdemos'); baseFileName = 'peppers.png'; % Get the full filename, with path prepended. fullFileName = fullfile(folder, baseFileName); if ~exist(fullFileName, 'file') % Didn't find it there. Check the search path for it. fullFileName = baseFileName; % No path this time. if ~exist(fullFileName, 'file') % Still didn't find it. Alert user. errorMessage = sprintf('Error: %s does not exist.', fullFileName); uiwait(warndlg(errorMessage)); return; end end rgbImage = imread(fullFileName); % Get the dimensions of the image. numberOfColorBands should be = 3. [rows columns numberOfColorBands] = size(rgbImage); % Display the original color image. subplot(2, 2, 1); imshow(rgbImage, []); axis on; title('Original Color Image', 'FontSize', fontSize); % Enlarge figure to full screen. set(gcf, 'units','normalized','outerposition',[0, 0, 1, 1]);

% Let's get our template by extracting a small portion of the original image. templateWidth = 71 templateHeight = 49 smallSubImage = imcrop(rgbImage, [192, 82, templateWidth, templateHeight]); subplot(2, 2, 2); imshow(smallSubImage, []); axis on; title('Template Image to Search For', 'FontSize', fontSize);

% Ask user which channel to search for a match. % channelToCorrelate = menu('Correlate which color channel?', 'Red', 'Green', 'Blue'); % It actually finds the same location no matter what channel you pick, % for this image anyway, so let's just go with red (channel #1). channelToCorrelate = 1; correlationOutput = normxcorr2(smallSubImage(:,:,1), rgbImage(:,:, channelToCorrelate)); subplot(2, 2, 3); imshow(correlationOutput, []); axis on; title('Normalized Cross Correlation Output', 'FontSize', fontSize);

% Find out where the normalized cross correlation image is brightest. [maxCorrValue, maxIndex] = max(abs(correlationOutput(:))); [yPeak, xPeak] = ind2sub(size(correlationOutput),maxIndex(1)) % Because cross correlation increases the size of the image, % we need to shift back to find out where it would be in the original image. corr_offset = [(xPeak-size(smallSubImage,2)) (yPeak-size(smallSubImage,1))]

% Plot it over the original image. subplot(2, 2, 4); % Re-display image in lower right. imshow(rgbImage); axis on; % Show tick marks giving pixels hold on; % Don't allow rectangle to blow away image. % Calculate the rectangle for the template box. Rect = [xLeft, yTop, widthInColumns, heightInRows] boxRect = [corr_offset(1) corr_offset(2) templateWidth, templateHeight] % Plot the box over the image. rectangle('position', boxRect, 'edgecolor', 'g', 'linewidth',2); % Give a caption above the image. title('Template Image Found in Original Image', 'FontSize', fontSize); uiwait(helpdlg('Done with demo!'));

Sonny Sood
on 29 Jul 2013

Thank you Sir,

Log in to comment.

Answer by Azzi Abdelmalek
on 28 Jul 2013

B=randi(100,9) % the big matrix [n,m]=size(B); S=randi(100,3) % the small matrix out=[]; for id1=1:3:n-3 for id2=1:3:m-3 a=B(id1:id1+2,id2:id2+2); out=[out;a(a>=S)]; end end

Sonny Sood
on 29 Jul 2013

I am getting error in this code at

line out=[out;a(a>=S)] of 'matrix dimensions must agree'

Azzi Abdelmalek
on 29 Jul 2013

In your case what are the sizes of your two matrices ?

Sonny Sood
on 30 Jul 2013

Log in to comment.

Answer by Azzi Abdelmalek
on 30 Jul 2013

Edited by Azzi Abdelmalek
on 30 Jul 2013

B=randi(100,512,512) ; % the big matrix [n,m]=size(B); S=randi(100,256,20) % the small matrix [n1,m1]=size(S); q1=fix(n/n1); q2=fix(m/m1); idxr= [ n1*ones(1,q1) n-n1*q1]; idxc=[m1*ones(1,q2) m-m1*q2]; idxc(~idxc)=[]; idxr(~idxr)=[]; out=[]; ii0=1; for id1=1:numel(idxr) ii1=ii0+idxr(id1)-1; jj0=1; for id2=1:numel(idxc) jj1=jj0+idxc(id2)-1; a=B(ii0:ii1,jj0:jj1); [nn,mm]=size(a); b=S(1:nn,1:mm); out=[out;a(a>=b)]; jj0=jj1+1; end ii0=ii1+1; end

Sonny Sood
on 5 Aug 2013

Can you please add comments for each line, as I am beginner in this, and also will be easy to grab the logic.

Thanks

Image Analyst
on 5 Aug 2013

Log in to comment.

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
## 3 Comments

## Azzi Abdelmalek (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/83327-how-to-compare-two-matrices-of-diffrent-dimensions-by-looping#comment_161800

If you have

What should be the result?

## Sonny Sood (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/83327-how-to-compare-two-matrices-of-diffrent-dimensions-by-looping#comment_161851

the small matrix should be compared with that of big matrix for greater than or equal to. The result is to find a match between the elements of two matrix's and store their positions(index) after being compared. The result i want is; 1=1,match found,store it 5>2,store it's position and the element 4>3,store it 0<4,neglect it

## Jan Simon (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/83327-how-to-compare-two-matrices-of-diffrent-dimensions-by-looping#comment_161886

@Sonny: Please answer Azzi's question. Do not describe how you want to create the output but post manually created results. Such unequivocal examples are very useful. I do not understand the explanation "1=1,match found,store it 5>2,store it's position and the element 4>3,store it 0<4,neglect it". Neither "store it" not "neglect it" reveal any details about the wanted result.

Log in to comment.