MATLAB: Avoiding nested loops

bigmatricesfor loopMATLABnestedloopperformance

Hi everyone, I'm new to Matlab and trying to get rid of java/c programmer customs. I'm trying to do same thing without any loop.(To increase performance since I'm dealing with matrices of size O(50'000×50'000) ).
Basically I'm trying to find number of rows of the matrix A that have 1 at both column i and column j. I need these two for loop to have(/access to) all possible 2-column combinations of A.
Thanks in advance
PS: Matrix a is (binary) sparse vector.
MATLAB code
tic
%%step 1 create random matrix, t>10'000
A=logical(rand(t,n0)<p);
toc
%step 2 this step is really fast, nothing to change
tic
%finding weight of all columns, summing up 1's in each column
wi=sum(A);
%marking vectors that do not satisfy condition
marked=find(wi<=(1-delta)*u1);
toc
%step 3
tic
%finding number of rows of A that have 1 at both column i and column j
%by multiplying it with its transpose
B=sparse(A)'*sparse(A);
%getting numbers (i.e )
W=triu(B,1);
edges=(W>=meanvalue);
toc
I'm still trying to optimize step 1 and step 3.

Best Answer

Some simple changes in your original implementation:
tic
W = zeros(n0, j - 1); % Pre-allocate!

for j = 2:n0
Aj = A(:, j);
for i = 1:j-1
W(i,j) = sum(and(A(:,i), Aj));
end
end
edges = transpose(W >= meanValue);
toc
I do not use "mean", because it is a Matlab function. If A contains just zeros and ones, AND is faster than check if the sum equals 2. In addition you can save memory when using a LOGICALs as values of your sparse array. This is a better start point to create a more vectorized version:
tic
W = zeros(n0, j - 1); % Pre-allocate!
for j = 2:n0
W(1:j-1, j) = sum(bsxfun(@and, A(:, 1:j-1), A(:, j)));
end
edges = transpose(W >= meanValue);
toc