Find all combinaisons of sum of two vector that corresponds to the value of a third vector
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
anthony dall'agnol
le 18 Juin 2019
Modifié(e) : Stephen23
le 18 Juin 2019
Hi community !
I have three vectors A, B and C.
A = [1561.28, 1561.64, 1562.00, 1562.36, 1562.72]; % signal
B = [1064.00, 1064.36, 1064.72, 1065.08, 1065.44]; % pump
C = [632.89, 633.02, 633.14, 633.27, 633.40]; % converted
I want to check all the possible combinaisons of A and B (see next function) that correspond to a value of C
func = 1./(1./A + 1./B) >> C
For example a correct anwser in the result vector would be [3 1 1] for :
1/( 1/A(3) + 1/B(1) ) = C(1)
I've already check some functions like nchoosecrit() but it only take one scalar as an result argument so I don't know.
0 commentaires
Réponse acceptée
Matt J
le 18 Juin 2019
Modifié(e) : Matt J
le 18 Juin 2019
tolerance=1e-6;
[A,B,C]=deal(A(:),B(:),C(:)); %Make everything a column vector
[Ar,Br,Cr]=deal(A,B.' , reshape(C,1,1,[]) );
lidx = abs( 1./Ar + 1./Br.' - 1./Cr ) <= tolerance ;
[i,j,k]=ind2sub(size(lidx), find(lidx));
locations=[i,j,k],
combinations=[A(i),B(j),C(k)]
3 commentaires
Plus de réponses (2)
Adam
le 18 Juin 2019
Well, what you wrote:
1./(1./A + 1./B)
will give you answers you can compare to C as e.g.
abs( 1./(1./A + 1./B) - C )
to give an absolute difference of each from C which you can then test against some threshold to see of they are close enough to equal.
1 commentaire
anthony dall'agnol
le 18 Juin 2019
Modifié(e) : anthony dall'agnol
le 18 Juin 2019
Stephen23
le 18 Juin 2019
Modifié(e) : Stephen23
le 18 Juin 2019
Simpler to use ndgrid:
>> A = [1561.28, 1561.64, 1562.00, 1562.36, 1562.72]; % signal
>> B = [1064.00, 1064.36, 1064.72, 1065.08, 1065.44]; % pump
>> C = [632.89, 633.02, 633.14, 633.27, 633.40]; % converted
>> [Aa,Ba,Ca] = ndgrid(A,B,C);
>> idx = abs(1./(1./Aa + 1./Ba) - Ca) < 0.01; % adjust tolerance to suit data.
>> [X,Y,Z] = ind2sub(size(idx),find(idx));
>> [X,Y,Z] % indices corresponding to A,B,C:
ans =
3 1 1
1 2 1
3 2 2
1 3 2
5 2 3
3 3 3
5 3 4
3 4 4
3 5 5
And checking (e.g. the last row):
>> 1/( 1/A(3) + 1/B(5) )
ans = 633.40
>> C(5)
ans = 633.40
0 commentaires
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!