View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
Vectorized FIND with 'FIRST' option

5.0 | 5 ratings Rate this file 15 Downloads (last 30 days) File Size: 5.13 KB File ID: #24641 Version: 1.1

Vectorized FIND with 'FIRST' option


Bruno Luong (view profile)


05 Jul 2009 (Updated )

Find the first non-zero element(s) along row/column - or any other dimension

| Watch this File

File Information

Up to now, to find the first non-zero element of a matrix along a column (for example) user might:

1. Use for-loop with FIND command
      for j=1:size(A,2)
            ... = find(A(:,j), 1, 'first');
2. Use other vectorized methods, often time not very straight-forwards (MAX, LOGICAL, SPARSE, etc...). This method creates temporary arrays and scan such the arrays few times while doing some calculation.

3. Write the basic FOR-LOOP algorithm to accomplish the task.

The FINDFIRST command does just the same, but implemented using MEX engine which should be faster than any of the above. It can handle 'FIRST', 'LAST' option, and return more than one FIND count.

NOTE: not yet tested on Linux (gcc)

MATLAB release MATLAB 7.8 (R2009a)
Other requirements Mex setup
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (10)
01 Jan 2016 Uri Cohen

05 Jun 2014 Bruno Luong

Bruno Luong (view profile)

@Cullen, please ask Mac developer forum. It is odd that an integer 32 bits is not 4 bytes. Something must be very wrong,

Comment only
04 Jun 2014 Joseph Cullen

I am getting the following error when trying to run this on a Mac use the compiler in Xcode. From the other comment about Linux, it seems that I have to change the typedef. Any ideas about what it should be for Mac?

Error using find1dmex
FIND1DMEX: incorrect int32 definition (modify MEX file is required)

Error in findfirst (line 106)
B = find1dmex(A, count);

Error in test_nonparam (line 80)

Comment only
01 Nov 2013 Liber Eleutherios

I have tried this:

M = 1000; N = 20000;
A = rand(M, N) < 0.5;
tic, B = findfirst(A, 1, M); toc
C = zeros(M, N);
inds = zeros(N, 1);
for hh = 1:N
tmp = find(A(:,hh));
inds(hh) = numel(tmp);
C((hh - 1) * M + (1:inds(hh))) = tmp;
all(B(:) == C(:))

Works fine.

Comment only
01 Nov 2013 Liber Eleutherios

26 Sep 2013 Karel Lebeda

Your comment is incorrect, on the 7th line should be:

Comment only
22 Aug 2013 David

David (view profile)

For this to work on linux, the typedefs need to be changed on lines 38-41 from:

typedef long long int int64;
typedef long int int32;
typedef short int16;
typedef char int08;


typedef int64_t int64;
typedef int32_t int32;
typedef int16_t int16;
typedef int8_t int08;


Comment only
22 Aug 2013 David

David (view profile)

17 Apr 2010 Andrea Freddi

17 Apr 2010 G. Sken

G. Sken (view profile)

handy and fast ! it implemnts an option not available in the standard matlab find function

19 May 2010 1.1

Fix a bug when 'last' in invoked on 64-bit platform

Contact us