web-dev-qa-db-fra.com

Comment initialiser toutes les entrées d'une matrice avec une valeur spécifique?

Dans Haskell , si je voulais obtenir une liste de 10 éléments contenant uniquement le nombre 5, je pourrais faire quelque chose comme ceci:

take 10 $ repeat 5

Sortie:

[5,5,5,5,5,5,5,5,5,5]

Est-ce qu'il y a quelque chose comme ça chez Matlab?

40
Tyler

Il est facile d’attribuer des valeurs répétées à un tableau:

x(1:10) = 5;

Si vous voulez générer le tableau d'éléments en ligne dans une instruction, essayez quelque chose comme ceci:

ones(1,10) * 5

ou avec repmat

repmat(5, 1, 10)
65
dkantowitz

La méthode one est beaucoup plus rapide que l’utilisation de repmat:

>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc
Elapsed time is 3.426347 seconds.
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc
Elapsed time is 20.603680 seconds. 

Et, à mon avis, rend le code beaucoup plus lisible.

22
MatlabSorter

Voir repmat dans la documentation.

B = repmat(5,1,10)
5
zellus

Étant donné une taille de matrice m-by-n prédéfinie et la valeur cible val, dans votre exemple:

m = 1;
n = 10;
val = 5;

il y a actuellement 7 différentes approches qui me viennent à l'esprit:


1) Utilisation de repmat function _ ​​(0.094066 secondes)

A = repmat(val,m,n)

2) Indexation sur la matrice non définie avec l'affectation _ ​​(0.091561 secondes)

A(1:m,1:n) = val

3) Indexation sur la valeur cible à l'aide des uns fonction _ ​​(0.151357 secondes)

A = val(ones(m,n))

4) Initialisation par défaut avec affectation complète _ ​​(0.104292 secondes)

A = zeros(m,n);
A(:) = val

5) Utilisation des uns fonction avec multiplication _ ​​(0.069601 secondes)

A = ones(m,n) * val

6) Utilisation de la fonction zéros avec l'addition _ ​​(0.057883 secondes)

A = zeros(m,n) + val

7) Utilisation de repelem function _ ​​(0.168396 secondes)

A = repelem(val,m,n)

Après la description de chaque approche, entre parenthèses, son repère correspondant est exécuté sous Matlab 2017a et avec des itérations 100000. Le gagnant est l'approche 6th, et cela ne me surprend pas.

L'explication est simple: l'allocation produit généralement des emplacements de mémoire remplis à zéro ... par conséquent, aucune autre opération n'est effectuée à l'exception de l'ajout de val à chaque membre de la matrice et, en plus, la désinfection des arguments en entrée est très courte.

On ne peut pas en dire autant de l'approche 5th, qui est la deuxième plus rapide parce que, malgré le fait que le processus de nettoyage des arguments d'entrée soit fondamentalement identique, trois opérations côté mémoire sont exécutées au lieu de deux:

  • l'allocation initiale
  • la transformation de chaque élément en 1
  • la multiplication par val
5
Tommaso Belluzzo

Comme mentionné dans d'autres réponses, vous pouvez utiliser:

>> tic; x=5*ones(10,1); toc
Elapsed time is 0.000415 seconds.

Une méthode encore plus rapide est:

>> tic;  x=5; x=x(ones(10,1)); toc
Elapsed time is 0.000257 seconds.
0
bluefocs