Finding the row number with two conditions in a matrix
2 views (last 30 days)
Show older comments
outData=[733458 91 1.01510000000000 1.01680000000000 1.01490000000000 1.01520000000000 1.01585000000000
733458 112 1.01620000000000 1.01620000000000 1.01400000000000 1.01610000000000 1.01510000000000
733458 135 1.01440000000000 1.01540000000000 1.01430000000000 1.01480000000000 1.01485000000000
733458 154 1.01420000000000 1.01580000000000 1.01410000000000 1.01420000000000 1.01495000000000
733459 168 1.01550000000000 1.01570000000000 1.01490000000000 1.01560000000000 1.01530000000000
733459 173 1.01550000000000 1.01570000000000 1.01490000000000 1.01560000000000 1.01530000000000
733459 174 1.01550000000000 1.01570000000000 1.01490000000000 1.01560000000000 1.01530000000000
733459 188 1.01550000000000 1.01570000000000 1.01490000000000 1.01560000000000 1.01530000000000
733460 157 1.01550000000000 1.01570000000000 1.01490000000000 1.01560000000000 1.01530000000000]
x=157;
result=[733458;733459];
for i=1:2
idx=find((outData(:,1) == result(i,1)) & ((x-outData(:,2)).^2) == min( (x-outData(:,2)).^2));
idx1{i}=idx;
end
There are two problems with the code above. First of all the idx code does not give me always the accurate row number and sometimes misses out a few rows. Secondly, I want to display all the rows that have the date serial number in results and that are closest to x in column 2. So in this case that should be 4 and 5 but I only get 4. Can anyone help?
0 Comments
Accepted Answer
Star Strider
on 25 Oct 2017
I am not certain what you want to do.
Calculating the separate parts of the conditions that create ‘idx’ separately and looking at them may give you some idea of where the problem is:
x=157;
result = [733458;733459];
idx1 = bsxfun(@eq, outData(:,1), result(1));
idx2 = bsxfun(@eq, outData(:,1), result(2));
idxx = bsxfun(@eq, (x-outData(:,2)).^2, min((x-outData(:,2)).^2));
You can then combine the individual logical vectors to give you the result you want as ‘idx’. This is probably a bit easier to debug than your original code.
2 Comments
Star Strider
on 25 Oct 2017
I simply copied the code you posted and created the logical vectors. The idea is that you can see what they do so you could troubleshoot your criteria.
‘I want to display all the rows that have the date serial number in results and that are closest to x in column 2.’
In your code, you are setting them to be exactly equal to the minimum, in this instance, 157. If you want to set them to a range, for example within 20 of the minimum, change the ‘idxx’ assignment to:
idxx = bsxfun(@lt, (x-outData(:,2)).^2, min((x-outData(:,2)).^2) + 20);
I still do not have a sense of what you want to do.
More Answers (1)
Andrei Bobrov
on 25 Oct 2017
x=157;
result=[733458;733459];
[~,g] = ismember(outData(:,1),result);
ii = find(x == outData(:,2));
g(ii) = g(ii - 1);
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!