Finding the first instance of a value in an array

89 visualizzazioni (ultimi 30 giorni)
I have an array with many rows and many columns. I want to search the array row by row, find the first instance of a value that is above 170 (yellow cells below) and then store the colum index it was found in (green cells below) in a new array. If there are no values above 170, then return 0 as the index.
This should explain it:

Risposta accettata

Walter Roberson
Walter Roberson il 29 Ott 2021
YourArray = randi([100 180], 10, 20)
YourArray = 10×20
110 163 114 129 160 127 126 132 104 147 134 159 169 117 170 117 153 127 180 165 103 137 155 141 159 129 137 162 172 109 159 160 134 156 166 110 179 166 137 136 116 168 151 105 110 180 116 112 171 152 112 178 154 101 169 137 176 144 137 159 163 153 100 132 104 153 174 180 127 164 162 127 153 118 113 133 112 158 108 129 105 118 159 147 137 158 114 168 124 164 146 163 114 107 104 153 144 146 162 130 122 138 149 162 156 122 113 105 147 147 164 107 149 160 149 117 150 122 138 152 142 122 149 105 141 127 151 103 133 179 164 133 100 164 129 134 116 124 140 177 127 162 180 176 175 143 110 149 160 156 171 145 106 156 174 118 159 179 131 161 104 126 102 109 137 126 118 139 155 180 168 165 151 173 168 167 137 101 120 127 142 107 130 136 159 126 129 152 127 164 140 129 107 178 122 177 169 169 155 100
idx = sum(cumprod(YourArray <= 170, 2),2) + 1;
idx( idx == size(YourArray,2) + 1 ) = 0;
idx
idx = 10×1
19 9 6 7 0 0 10 3 10 14
  1 Commento
Pelajar UM
Pelajar UM il 30 Ott 2021
Modificato: Pelajar UM il 30 Ott 2021
Perfect. Now as you see YourArray is an Nx9 double. It represents a certain intensity at 9 points in space. I need to use the idx generated here to sort these 3D point array which is Nx(3x9) ( 3 for x,y,z times M points).
How can I do that? Do I need the row index too?
And my idea was those point that correlate with the idx of 0 will be removed in the sorted array but this is not how it works. I get this error:
Index in position 1 is invalid. Array indices must be positive integers or logical values.

Accedi per commentare.

Più risposte (1)

Chris
Chris il 29 Ott 2021
A = magic(5)
A = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
for idx = 1:size(A,1)
test = find(A(idx,:)>22,1);
if isempty(test)
test = 0;
end
colidxs(idx,1) = test;
end
colidxs
colidxs = 5×1
2 1 0 0 3
A is your array, and replace 22 with 170.
  1 Commento
Chris
Chris il 29 Ott 2021
For something a bit faster, try
A = magic(5);
colidxs = rowfun(@findidx,table(A))
function idx = findidx(row)
idx = find(row > 22,1);
if isempty(idx)
idx = 0;
end
end

Accedi per commentare.

Categorie

Scopri di più su Structures in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by