2013-05-08 1 views

ответ

4

Вы также можете сделать это с помощью функции diff:

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

[] и 2 сказать diff действовать по второму измерению Y, как указано в вашем вопросе ,

Обратите внимание, что это на самом деле быстрее, потому что diff является встроенной функцией:

>> 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: Было предложено использовать функцию timeit для расчета этих таймингов более точно; Результаты:

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

ans = 

    0.0071 

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

ans = 

    0.0119 

Кроме того, размещение этих файлов в m-файле, по-видимому, не имеет значения в этом случае.

+2

Функция 'diff' хороша для простых различий. Однако ваши тайминги немного сомнительны. Если вторая форма помещается в m-файл, Matlab, скорее всего, скомпилирует ее и сделает скорость сопоставимой. Вы также должны использовать функцию ['timeit'] (http://www.mathworks.com/matlabcentral/fileexchange/18798) для лучшей точности здесь. – sfstewman

+0

Фантастический! Очень полно, спасибо :) – HCAI

3

Не используйте bsxfun. Сделайте это легкий путь:

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