How to do Subtraction on sets?

7 visualizaciones (últimos 30 días)
ramin bba
ramin bba el 6 de Jul. de 2014
Comentada: ramin bba el 7 de Jul. de 2014
I have a continuous set (A=[0 , 2pi]) and want to subtract the following sets from it:
B= [0, pi/2];
C=[pi/4, pi];
D=[3pi/2, 7pi/4];
...
In general, I could just build the union of "B, C, ..." and then do the subtraction BUT I have to do this process a lot of times. In other words, the whole process is in a "for loop" and each time some sets need to be subtracted from A (each time the number of sets and their length is not necessarily might change). The initial interval (A) is the same for all the iterations (after each iteration I would get an interval corresponding to that iteration: Answer(i) = A - B(i) - C(i) -...).
I found a function in MATLAB called "setdiff" but it seems to only work on discrete intervals or images (I mean a 2D matrix)!
Is there a similar function for continuous intervals/sets?
Any help would be appreciated,
  1 comentario
Image Analyst
Image Analyst el 6 de Jul. de 2014
What's a continuous set? There is no continuous set of numbers in computers. If A is an array, then A has a certain, fixed and finite number of elements with certain definite values, so A must be discrete/digitized, not continuous.

Iniciar sesión para comentar.

Respuesta aceptada

Image Analyst
Image Analyst el 6 de Jul. de 2014
Try this:
A = 0:360;
B = 0 : 60;
C = 45 : 60;
D = 270 : 360;
foundIndexesB = find(ismember(B, A))
foundIndexesC = find(ismember(C, A))
foundIndexesD = find(ismember(D, A))
allFoundIndexes = [foundIndexesB, foundIndexesC, foundIndexesD]
% Get rid of those numbers from A
A(allFoundIndexes) = [];
  2 comentarios
ramin bba
ramin bba el 6 de Jul. de 2014
Editada: Image Analyst el 6 de Jul. de 2014
tnx a lot, it works but with a minor change:
foundIndexesB = find(ismember(A,B))
foundIndexesC = find(ismember(A,C))
foundIndexesD = find(ismember(A,D))
ramin bba
ramin bba el 7 de Jul. de 2014
I used the method you outlined and it works. However, I am getting this suggestion from MATLAB and was wondering if you could elaborate on it a bit:
"if "A" is an indexed variable, performance can be improved using logical indexing instead of FIND.".
I know what is Logical indexing in general but I do not know how it can be used instead of "find".
tnx in advance

Iniciar sesión para comentar.

Más respuestas (1)

Roger Stafford
Roger Stafford el 6 de Jul. de 2014
You might consult these sites:
http://www.mathworks.com/matlabcentral/fileexchange/31753-range-intersection
http://www.mathworks.com/matlabcentral/fileexchange/24254-interval-merging
  1 comentario
ramin bba
ramin bba el 6 de Jul. de 2014
tnx for the answer Roger but the codes do not work. for example, if I have the following:
A=[0 360];
B=[0 60], C=[45 60], D=[270 360];
A-B-C-D=[60 27]
I even tried going one at a time (like below), but no success:
A-B=[60 360];
A-C=[0 45]+[60 360];
A-D=[0 270];
union{(A-B),(A-C),(A-D)}=[60 270];
They gave me though a rough idea of how to approach the problem.
tnx again,

Iniciar sesión para comentar.

Categorías

Más información sobre Matrices and Arrays en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by