Restricting a set of data by a spherical radius
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
jgillis16
il 3 Ago 2015
Modificato: jgillis16
il 10 Ago 2015
I need to restrict column 3 of the attached text file by a spherical radius with a central number of 12.51 that has a radius that extends 0.7333 in every direction.
6 Commenti
Walter Roberson
il 3 Ago 2015
What do you want to happen for cases that do not match that?
Is "dec" intended to convey "declination", and is "ra" intended to convey "right ascension" (instead of "radius" for example) ?
What formula should be used to test to see if a value is in range?
Risposta accettata
Walter Roberson
il 4 Ago 2015
function d=angulardist(ra1,dec1,ra2,dec2)
if ~(isscalar(ra1) || isscalar(dec1) || isequal(size(ra1),size(dec1)) &&
~(isscalar(ra2) || isscalar(dec2) || isequal(size(ra2),size(dec2))
error("angulardist: input vector dimensions don't match");
end
if ~(isscalar(ra1) || isscalar(ra2) || isequal(size(ra1),size(ra2))
d = sind(dec1).*sind(dec2)+cosd(dec1).*cosd(dec2).*cosd(ra1-ra2);
elseif size(ra1,2)==1 && size(ra2,1)==1
d = sind(dec1)*sind(dec2)+(cosd(dec1)*cosd(dec2)).*cosd(repmat(ra1,1,length(ra2))-repmat(ra2,length(ra1),1));
else
error("angulardist: input vector dimensions don't match");
end
idx = find(d>1+eps);
d = real(acosd(d));
if ~isempty(idx)
warning("angulardist: irregular angular coordinates");
d(idx)=nan;
end
end
function out = selectobjectsinfield(in,RA,DEC,fieldDesc,rejectflag)
if nargin<5
rejectflag=false;
end
if isscalar(fieldDesc)
circle = true;
radius = fieldDesc;
else
circle = false; # rectangle
RAwidth = fieldDesc(1);
DECwidth = fieldDesc(2);
end
ra = [in(:).RA];
dec = [in(:).dec];
if circle == true
angularDist = angulardist(ra,dec,RA,DEC);
if rejectflag
idx = find((abs(angularDist)>=radius));
else
idx = find((abs(angularDist)<=radius));
end
else
RADist = angulardist(ra,dec,RA,dec);
decDist = angulardist(ra,dec,ra,DEC);
if rejectflag
idx = find((abs(RADist)>=RAwidth/2)&(abs(decDist)>=DECwidth/2));
else
idx = find((abs(RADist)<=RAwidth/2)&(abs(decDist)<=DECwidth/2));
end
end
out = in(idx);
end
2 Commenti
Walter Roberson
il 4 Ago 2015
Change the first part to
if ~(isscalar(ra1) || isscalar(dec1) || isequal(size(ra1),size(dec1))) &&
~(isscalar(ra2) || isscalar(dec2) || isequal(size(ra2),size(dec2)))
error("angulardist: input vector dimensions don't match");
end
if ~(isscalar(ra1) || isscalar(ra2) || isequal(size(ra1),size(ra2)))
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Cell Arrays 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!