Calculate differences between all values in vector

41 visualizaciones (últimos 30 días)
Swisslog
Swisslog el 7 de Abr. de 2014
Comentada: Mehri Mehrnia el 19 de Mayo de 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.

Respuesta aceptada

David Sanchez
David Sanchez el 7 de Abr. de 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 comentarios
Swisslog
Swisslog el 7 de Abr. de 2014
...and
sol=sol(:);
sol(sol==0) = [];
to reduce to a single column I guess. Many thanks!
Jos (10584)
Jos (10584) el 7 de Abr. de 2014
This will be very slow for large inputs.

Iniciar sesión para comentar.

Más respuestas (2)

Jos (10584)
Jos (10584) el 7 de Abr. de 2014
Editada: Jos (10584) el 7 de Abr. de 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 comentarios
Soyy Tuffjefe
Soyy Tuffjefe el 14 de Ag. de 2021
Editada: Soyy Tuffjefe el 14 de Ag. de 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 el 19 de Mayo de 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.

Iniciar sesión para comentar.


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

Iniciar sesión para comentar.

Categorías

Más información sobre Startup and Shutdown en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by