What is the most efficient way to find the position in the column of a matrix where the value drops below a given threshold (values are constantly decreasing down the columns)?

1 view (last 30 days)
I have a large (up to 1000x1000) matrix which is the solution to a pde - the columns are the increments in time and the rows are the increments in space. The values down each column are decreasing and I want to find the row of each column where the value drops below a certain value (1 in the code below) and store these values in a vector where the value at each position is the row where it drops below the threshold. My method works perfectly well but is very slow, is there a better way?
My code:
timeivector = 2:state.Numberoftimesteps; %starts at 2 since initial condition is zero everywhere
spaceivector = 1:state.Numberofspacesteps;
for ti = timeivector
for xi = spaceivector
if largematrix(xi,ti) <= 1
continue
end
outputvector(ti) = xi+1;
end
end

Accepted Answer

Joel Miller
Joel Miller on 13 Dec 2017
Similar to the previous answer, but without the meshgrid:
largelogical = largematrix <= 1;
[value, index] = max(largelogical);

More Answers (3)

Walter Roberson
Walter Roberson on 13 Dec 2017
first_row_below_threshold = sum(largematrix >= 1, 1) + 1;
Note: if none of the rows are below the threshold then the value will be 1 more than the number of rows in the matrix.

Birdman
Birdman on 13 Dec 2017
Edited: Birdman on 13 Dec 2017
One approach:
outputvector=largematrix(largematrix<=1);
To find specific rows and columns for the values:
[r,c]=find(largematrix<=1);

Rik
Rik on 13 Dec 2017
Edited: Rik on 13 Dec 2017
It will be much faster to use find, but you don't even need to.
You can use meshgrid to generate indices (like repmat((1:1000)',1,1000), but faster and clearer). Then use logical indexing to set all positions in the grid to inf for values>1, then using min will give you a vector with indices.
PS this will only find you 1 index per column

Categories

Find more on Numeric Types in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!