2013-05-08 3 views

Répondre

4

Vous pouvez aussi le faire en utilisant la fonction diff:

dY = -diff(Y, [], 2) 

Le [] et 2 dire diff pour faire fonctionner le long de la deuxième dimension de Y, comme indiqué dans votre question .

Notez que c'est plus rapide, parce que diff est une fonction intégrée:

>> Y = rand(100, 10000); 
>> tic; for n = 1:1000; dY = -diff(Y, [] , 2); end; toc 
Elapsed time is 5.453160 seconds. 
>> tic; for n = 1:1000; dY = Y(:,1:end-1) - Y(:,2:end); end; toc 
Elapsed time is 11.383666 seconds. 

Edit: Il a été suggéré d'utiliser la fonction timeit pour calculer ces horaires avec plus de précision; les résultats sont:

>> timeit(@()-diff(Y, [] , 2)) 

ans = 

    0.0071 

>> timeit(@()Y(:,1:end-1) - Y(:,2:end)) 

ans = 

    0.0119 

De plus, les placer dans un fichier m ne semble pas faire de différence dans ce cas.

+2

La fonction 'diff' est intéressante pour les différences simples. Cependant, vos horaires sont un peu discutables. Si le second formulaire est placé dans un fichier m, Matlab le compilera probablement et rendra la vitesse comparable. Vous devriez également utiliser la fonction ['timeit'] (http://www.mathworks.com/matlabcentral/fileexchange/18798) pour une meilleure précision ici. – sfstewman

+0

Fantastique! Très complet, merci :) – HCAI

3

N'utilisez pas bsxfun. Faites le chemin facile:

dY = Y(:,1:end-1) - Y(:,2:end) 
0
Y = rand(1000,28); 
[r, c] = size(Y); 

Ycol_sub = zeros(r,c-1); 

for i=1:c-1 
    Ycol_sub(:,i) = Y(:,i)-Y(:,i+1); 
end 

Ycol_sub2 = bsxfun(@minus, Y(:,1:end-1), Y(:,2:end)); 

all(all(Ycol_sub == Ycol_sub2)) 

ans = 

     1 
Questions connexes