J'ai un tableau Y=rand(1000,28);
je veux trouver la différence ainsi en colonne:soustraction de la matrice en utilisant Matlab Vectorisation bsxfun
[~ c]=size(Y);
for i=1:c-1
Y(:,i)-Y(:,i+1)
end
Puis-je faire cela en utilisant bsxfun
?
J'ai un tableau Y=rand(1000,28);
je veux trouver la différence ainsi en colonne:soustraction de la matrice en utilisant Matlab Vectorisation bsxfun
[~ c]=size(Y);
for i=1:c-1
Y(:,i)-Y(:,i+1)
end
Puis-je faire cela en utilisant bsxfun
?
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.
N'utilisez pas bsxfun. Faites le chemin facile:
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
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
Fantastique! Très complet, merci :) – HCAI