Filter löschen
Filter löschen

Calculate differences between all values in vector

41 Ansichten (letzte 30 Tage)
Swisslog
Swisslog am 7 Apr. 2014
Kommentiert: Mehri Mehrnia am 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.

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Jos (10584)
Jos (10584) am 7 Apr. 2014
Bearbeitet: Jos (10584) am 7 Apr. 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 Kommentare
Soyy Tuffjefe
Soyy Tuffjefe am 14 Aug. 2021
Bearbeitet: Soyy Tuffjefe am 14 Aug. 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 am 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.

Melden Sie sich an, um zu kommentieren.


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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Programming finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by