Prenons le cas d'une matrice A et d'un vecteur B :
Code : | Sélectionner tout |
1 2 3 | A = [1 2 ; 3 4 ; 5 6 ; 7 8] B = [2 4] |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | A = 1 2 3 4 5 6 7 8 B = 2 4 |
Par exemple, une simple soustraction, A - B qui renverrait :
Code : | Sélectionner tout |
1 2 3 4 5 6 | ans = -1 -2 1 0 3 2 5 4 |
Code : | Sélectionner tout |
1 2 3 | >> A-B ??? Error using ==> minus Matrix dimensions must agree. |
------------------------------------------------------
Défi : Trouver la méthode la plus rapide pour effectuer une soustraction entre les colonnes d'une matrice et un vecteur
Contrainte : le code devra être contenu dans un fichier m fonction dont le nom sera votre pseudo (si votre pseudo n'est pas accepté comme nom de fonction, prenez un nom similaire ). Cette fonction prendra en argument d'entrée une matrice A et un vecteur B et retournera en argument de sortie une matrice C résultat.
Par exemple, si je (Dut) propose une solution, la première ligne du fichier sera :
Code : | Sélectionner tout |
function C = Dut(A,B)
- les noms de variable A,B,C sont donnés à titre indicatif et peuvent être modifiés
- rien n'empêche de faire appel à d'autres fichiers à l'intérieur de matvec.m
Alors, quelle serait la méthode la plus rapide sous MATLAB selon vous ?
A vous de jouer... donnez vos solutions à la suite de ce message
------------------------------------------------------
Les solutions proposées :
mr_samurai :
Code : | Sélectionner tout |
1 2 3 | function C = mr_samurai(A, B) C = A - ones(size(A,1),1)*B; |
Code : | Sélectionner tout |
1 2 3 | function C = vinc_mai(A,B) C = A - repmat(B,size(A,1),1); |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | function C = caroline(A, B) [m,n] = size(A); C = zeros(size(A)); for i=1:m C(i,:) = A(i,:)-B; end |
Code : | Sélectionner tout |
1 2 3 | function C = tug83(A,B) C = bsxfun(@minus, A, B); |
Code : | Sélectionner tout |
1 2 3 | function C = Dut(A,B); C = Dutmex(A,B); |
Code utilisé pour la comparaison :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | function [T,users,N] = microDefi2(num) if nargin == 0 num = 7; end % Taille croissante des données N = 10.^(0:num-1); % Données initiales iA = [1 2 ; 3 4 ; 5 6 ; 7 8]; iB = [2 4]; % Membres participant au défi users = {'mr_samurai' 'vinc-mai' 'caroline' 'tug83'}; nusers = numel(users); mt = 5; nT = 1; for n=1:numel(N) % Augmentation de la taille des données au fur et à mesure A = repmat(iA,1,N(n)); B = repmat(iB,1,N(n)); %% Solution de mr_samurai for k=1:mt tic C = mr_samurai(A,B); t(k) = toc; clear C end T(nT,1) = mean(t); %% Solution de vinc-mai for k=1:mt tic C = vinc_mai(A,B); t(k) = toc; clear C end T(nT,2) = mean(t); %% Solution de Caro-line for k=1:mt tic C = caroline(A,B); t(k) = toc; clear C end T(nT,3) = mean(t); %% Solution de tug83 if exist('bsxfun','builtin')==5 % Cette fonction n'est pas disponible avec toutes les versions for k=1:mt tic C = tug83(A,B); t(k) = toc; clear C end T(nT,4) = mean(t); else T(nT,4) = nan; end %% Fin des solutions proposées nT = nT +1; end |
Temps d'exécution :
MATLAB R2008a - Windows XP - 2GHz - 2Go Ram
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | N mr_samurai vinc-mai caroline tug83 Dut 1 0.000848 0.000932 0.001002 0.000739 0.000249 10 0.000036 0.000076 0.000020 0.000045 0.000012 100 0.000036 0.000081 0.000018 0.000055 0.000019 1000 0.000107 0.000126 0.000053 0.000164 0.000106 10000 0.001491 0.001802 0.000913 0.001691 0.001289 100000 0.021650 0.033351 0.033862 0.018619 0.017151 1000000 0.242351 0.342116 0.294612 0.189642 0.179889 |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | N mr_samurai vinc-mai caroline tug83 1 0.166230 0.000183 0.003227 0.002319 10 0.001539 0.000057 0.000020 0.000032 100 0.000035 0.000065 0.000019 0.000045 1000 0.000185 0.000277 0.000150 0.000202 10000 0.003575 0.003802 0.003620 0.002428 100000 0.027099 0.030994 0.028084 0.020660 1000000 0.264510 0.301678 0.280330 0.207564 |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | N mr_samurai vinc-mai caroline tug83 Dut 1 0.000021 0.000043 0.000014 0.000025 0.000009 10 0.000013 0.000039 0.000009 0.000022 0.000008 100 0.000017 0.000042 0.000011 0.000029 0.000014 1000 0.000080 0.000079 0.000042 0.000098 0.000074 10000 0.001122 0.000519 0.000773 0.001603 0.000893 100000 0.017785 0.023169 0.025011 0.011389 0.012374 1000000 0.185730 0.246647 0.260227 0.115151 0.127354 |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | N mr_samurai vinc-mai caroline tug83 Dut 1 0.000078 0.000135 0.000062 0.000084 0.000327 10 0.000036 0.000131 0.000026 0.000062 0.000052 100 0.000050 0.000142 0.000039 0.000082 0.000073 1000 0.000222 0.000157 0.000055 0.000193 0.000163 10000 0.002153 0.001704 0.000903 0.001920 0.001592 100000 0.023430 0.027308 0.028055 0.019134 0.018004 1000000 0.247297 0.259067 0.275122 0.186231 0.174071 |
- N est l'ordre de grandeur du nombre de colonne de A (A possède 4*N colonnes)
- les résultats sont donnés en secondes
------------------------------------------------------