function logicalIndex
%% Logical Indexing 
% Copyright 2015 The MathWorks, Inc.
%
% This is an example of how to do some logical indexing -- 
% how you can vectorize code that might use an nested for loop
% and an if statement. 

%%  Finding elements using logical matrices
% " While most indices are numeric, indicating a certain row or column
% number, logical indices are positional. That is, it is the position of 
% each 1 in the logical matrix that determines which array element is 
% being referred to " 

N = 4000;

A  = magic(N);  
A2 = magic(N);
A3 = magic(N);

thresh = 1e6; 

%%  Using an if and a nested for loop 
%  In this example we want to find all values that are over myRef.
%  This is how we do that in a nested for loop with an if-statement:

tic

ix = 1;

vals = zeros(numel(A),1);

for jj = 1:N
    for ii = 1:N
        if A(ii,jj) > thresh
            vals(ix) = A(ii,jj);
            ix = ix + 1;
        end
    end
end

vals(ix:end) = []; 

toc

%%  Using the find Function

% "The find function determines the indices of array elements that meet 
% a given logical condition. It returns the indices in the form of linear
% indexing " !

% myIndex = find(A2 > thresh);
% display(myIndex(1:3))

%%
tic
vals2 = A2(find(A2 > thresh));
toc


%% Using logical indexing

tic
vals3 = A3(A3 > thresh);
toc


%% Assert same answer
assert(isequal(vals,vals2,vals3),'Values aren''t equal!');
% Copyright 2015 The MathWorks, Inc.
