Finding the first instance of a value in an array

조회 수: 46(최근 30일)
Pelajar UM
Pelajar UM 2021년 10월 29일
편집: Pelajar UM 2021년 10월 30일
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:

채택된 답변

Walter Roberson
Walter Roberson 2021년 10월 29일
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
Pelajar UM
Pelajar UM 2021년 10월 30일
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.

댓글을 달려면 로그인하십시오.

추가 답변(1개)

Chris
Chris 2021년 10월 29일
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
Chris
Chris 2021년 10월 29일
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

댓글을 달려면 로그인하십시오.

태그

Community Treasure Hunt

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

Start Hunting!

Translated by