Bonjour,

Deux nouveaux défis à optimiser.

Premier problème :

J'ai une matrice vide zeros(L,C).

Je veux que les 1 à N éléments consécutifs de chaque ligne soit des 1 où N est un nouveau nombre aléatoire de 1 à C pour chaque ligne. Je tiens aussi à ce que ce soit aussi rapide que possible, considérant des valeurs de L et C pouvant dépasser 100.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
X = ones(L,1)*(1:C) <= ceil(rand(L,1)*C)*ones(1,C);
Exemple avec L = 20 et C = 10 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X =
 
     1     1     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     0     0
     1     1     1     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     0     0     0     0     0
     1     1     1     1     0     0     0     0     0     0
     1     0     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     1     0
     1     1     1     0     0     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0
     1     1     1     0     0     0     0     0     0     0
     1     1     1     1     1     0     0     0     0     0
     1     1     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     0     0     0     0
     1     1     1     1     1     1     1     0     0     0
     1     1     1     1     1     1     1     1     0     0
     1     1     1     1     1     1     1     0     0     0
     1     1     1     1     1     0     0     0     0     0
     1     1     1     1     1     1     1     0     0     0
Deuxième problème :

J'ai une matrice logique vide false(L,C).

Je veux faire passer à true un seul élément par ligne et ce aléatoirement. Je tiens aussi à ce que ce soit aussi rapide que possible, considérant des valeurs de L et C pouvant dépasser 100.

Voici ce que je fais actuellement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
X = false(C,L);
X(ceil(rand(1,L)*C+(0:C:(C*(L-1))))) = true;
X = X';
Exemple avec L = 20 et C = 10 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X =
 
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     1     0     0     0     0     0
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     1     0     0     0
     1     0     0     0     0     0     0     0     0     0
     1     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     0     1     0     0
     0     0     0     0     0     1     0     0     0     0
     0     0     0     0     0     1     0     0     0     0
     0     0     0     0     0     0     1     0     0     0
     1     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     1     0     0
     1     0     0     0     0     0     0     0     0     0
     0     0     0     1     0     0     0     0     0     0
     0     0     0     1     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     1
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     1
Merci !

Éric

NB, quelques observations :

- L'utilisation de ceil(rand()) est plus rapide que randi()
- Les produits vectoriels sont plus rapides que meshgrid() et repmat()
- La comparaison de matrices ajustées à la même taille semble plus rapide que l'utilisation de bsxfun()