Consider three row vectors in Matlab, A
, B
, C
, each with size 1xJ
. I want to construct a matrix D
of size Kx2
listing every possible pairs of elements (a,b)
such that:
a
is an element ofA
.b
is an element ofB
.a-b
is an element ofC
.a
andb
are different fromInf
,-Inf
.
For example,
A=[-3 3 0 Inf -Inf];
B=[-2 2 0 Inf -Inf];
C=[Inf -Inf -1 1 0];
D=[-3 -2; %-3-(-2)=-1
3 2; % 3-2=1
0 0]; % 0-0=0
I would like this code to be efficient, because in my real example I have to repeat it many times.
CodePudding user response:
If J
is not too large so that you can afford two intermediate matrices of size up to J
×J
, this can be done in a vectorized way, which usually means it will be fast:
A = [-3 3 0 Inf -Inf];
B = [-2 2 0 Inf -Inf];
C = [Inf -Inf -1 1 0];
[a, b] = ndgrid(A(~isinf(A)), B(~isinf(B)));
ind = ismember(a-b, C);
result = [a(ind) b(ind)];
This works by generating all pairs that fulfil the individual conditions (such as being finite), and then selecting those pairs that fulfil the joint condition (such as their difference being in a prescribed set of values).