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 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
J2A2B2
am 13 Dez. 2017
Kommentiert: Jos (10584)
am 14 Dez. 2017
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
0 Kommentare
Akzeptierte Antwort
Joel Miller
am 13 Dez. 2017
Similar to the previous answer, but without the meshgrid:
largelogical = largematrix <= 1;
[value, index] = max(largelogical);
2 Kommentare
Rik
am 13 Dez. 2017
value will by definition be 1, but I must admit this is more elegant (and faster) than my solution.
Weitere Antworten (3)
Walter Roberson
am 13 Dez. 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.
1 Kommentar
Jos (10584)
am 14 Dez. 2017
This makes excellent use of the given fact that the columns are in decreasing order. +1
Rik
am 13 Dez. 2017
Bearbeitet: Rik
am 13 Dez. 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
0 Kommentare
Siehe auch
Kategorien
Mehr zu Boundary Conditions finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!