How to do Subtraction on sets?

7 Ansichten (letzte 30 Tage)
ramin bba
ramin bba am 6 Jul. 2014
Kommentiert: ramin bba am 7 Jul. 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 Kommentar
Image Analyst
Image Analyst am 6 Jul. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Image Analyst
Image Analyst am 6 Jul. 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 Kommentare
ramin bba
ramin bba am 6 Jul. 2014
Bearbeitet: Image Analyst am 6 Jul. 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 am 7 Jul. 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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Roger Stafford
Roger Stafford am 6 Jul. 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 Kommentar
ramin bba
ramin bba am 6 Jul. 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,

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by