У меня есть массив Y=rand(1000,28);
я хочу найти разницу столбцов таким образом:Matlab Vectorising матрица вычитание с помощью bsxfun
[~ c]=size(Y);
for i=1:c-1
Y(:,i)-Y(:,i+1)
end
Могу ли я сделать это с помощью bsxfun
?
У меня есть массив Y=rand(1000,28);
я хочу найти разницу столбцов таким образом:Matlab Vectorising матрица вычитание с помощью bsxfun
[~ c]=size(Y);
for i=1:c-1
Y(:,i)-Y(:,i+1)
end
Могу ли я сделать это с помощью bsxfun
?
Вы также можете сделать это с помощью функции 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-файле, по-видимому, не имеет значения в этом случае.
Не используйте bsxfun. Сделайте это легкий путь:
dY = Y(:,1:end-1) - Y(:,2:end)
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
Функция 'diff' хороша для простых различий. Однако ваши тайминги немного сомнительны. Если вторая форма помещается в m-файл, Matlab, скорее всего, скомпилирует ее и сделает скорость сопоставимой. Вы также должны использовать функцию ['timeit'] (http://www.mathworks.com/matlabcentral/fileexchange/18798) для лучшей точности здесь. – sfstewman
Фантастический! Очень полно, спасибо :) – HCAI