Effacer les filtres
Effacer les filtres

Calculate differences between all values in vector

38 vues (au cours des 30 derniers jours)
Swisslog
Swisslog le 7 Avr 2014
Commenté : Mehri Mehrnia le 19 Mai 2022
I'm trying to produce some code that will calculate the differences between nearly all values in a vector.
Specifically, say I have a vector [2 3 1 4]
Starting at 2 and moving through the vector, I need to calculate the difference between 2 and 3 (i.e. -1), 2 and 1, 2 and 4, then 3 and 1, 3 and 4, and then 1 and 4. I don't need to calculate the difference between, say, 3 and 2, and I'm only interested in the differences in one direction.
The vector I want to use the code on will be substantially bigger, and I'd like the output stored in a new, single column vector. I figured diff might provide a way forward, but can't see how to implement it specifying a 'lag'. Any help would be appreciated.

Réponse acceptée

David Sanchez
David Sanchez le 7 Avr 2014
my_vct = [2 3 1 4 5 6];
L = numel(my_vct);
tmp_vct = [my_vct(2:end) my_vct(end)];
x = my_vct - tmp_vct;
sol = zeros(L-1,L);
for k=2:L
tmp_vct = [my_vct(k:end) my_vct((L-k+2):end)];
sol(k-1,:) = my_vct - tmp_vct;
end
sol =
-1 2 -3 -1 -1 0
1 -1 -4 -2 0 0
-2 -2 -5 0 0 0
-3 -3 0 0 0 0
-4 0 0 0 0 0
  3 commentaires
Swisslog
Swisslog le 7 Avr 2014
...and
sol=sol(:);
sol(sol==0) = [];
to reduce to a single column I guess. Many thanks!
Jos (10584)
Jos (10584) le 7 Avr 2014
This will be very slow for large inputs.

Connectez-vous pour commenter.

Plus de réponses (2)

Jos (10584)
Jos (10584) le 7 Avr 2014
Modifié(e) : Jos (10584) le 7 Avr 2014
V = [2 3 1 4] ;
D1 = bsxfun(@minus,V(:), V(:).') % square form
% another option, only unique combinations, requires less memory
D2 = arrayfun(@(k) V(k:end)-V(k), 1:numel(k),'un',0)
D2 = [D2{:}]
  3 commentaires
Soyy Tuffjefe
Soyy Tuffjefe le 14 Août 2021
Modifié(e) : Soyy Tuffjefe le 14 Août 2021
Thanks to Jos (10584) for your code...
I have a 5x1000 matrix (numerical entries),
M=[1 5 8 75 120;
1 25 18 5 10;
⋮ ⋮ ⋮ ⋮ ⋮
7 39 118 125 10]
and want to apply her or his code:
D2 = arrayfun(@(k) V(k:end)-V(k), 1:numel(k),'un',0)
D2 = [D2{:}
to every row of M, please, could anybody modify this code for this job.
Thanks in avanced!
Mehri Mehrnia
Mehri Mehrnia le 19 Mai 2022
A great idea.
any body knows computation cost of bsxfun(@minus,V(:), V(:).')???
I mean linear or 2nd order or...
I work with arrays in order of millions, that's why it's important for me.

Connectez-vous pour commenter.


Mischa Kim
Mischa Kim le 7 Avr 2014
Swisslog, you could use
pdist([2 3 1 4]',@(x,y) x-y)
  1 commentaire
Swisslog
Swisslog le 7 Avr 2014
Sounds ideal! Afraid I don't have the statistics toolbox though

Connectez-vous pour commenter.

Catégories

En savoir plus sur Startup and Shutdown dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by