MATLAB: Essayer de gérer une grande matrice de dimensions nx101 où n est inconnu au début de la boucle

Donc, j’écris un code pour calculer la courbe de température le long d’une tige unidimensionnelle en fonction du temps jusqu’à l’état d’équilibre, et la méthode numérique que j’utilise n’a besoin que de la courbe de température du pas de temps précédent (qui est stockée dans la matrice ), ainsi que l’itération précédente dans le pas de temps actuel (qui est supprimé après le calcul), mais je dois conserver les valeurs de tous les pas de temps précédents même si elles ne sont plus pertinentes pour le calcul. Les matrices que je stocke deviennent extrêmement grandes, et donc Matlab commence à ralentir, je me demandais s’il y avait des astuces que je pourrais utiliser.

Meilleure réponse

  • Facile, facile (avec les bons outils.)
    Par exemple, je simulerai 101 marches aléatoires parallèles en 1 dimension, ne m’arrêtant que lorsque l’une d’entre elles sortira d’une limite prédéfinie, mais je stockerai toutes les marches dans un tableau. À la toute fin, je décompresse la poignée de fonction dans laquelle les données ont été stockées.
     
    tic
    % initialization step
    funh = growdata2;
    n = 101;
    walklimit = 1000;
    vec = zeros(1,n);
    funh(vec);
    theMoonIsBlue = true;
    steps = 0;
    while theMoonIsBlue
    steps = steps + 1;
    % Each step uses only the previous step.
    vec = vec + randn(1,n);
    funh(vec)
    if any(abs(vec) > walklimit)
    theMoonIsBlue = false;
    end
    end
    allwalkdata = funh();
    toc
     
    Le temps écoulé est de 9,192757 secondes.
    9 secondes, c’est bien mieux que le même calcul aurait pris si j’avais développé un tableau dynamiquement, en ajoutant une nouvelle ligne au tableau à chaque étape.
     
    steps
    steps =
    189995
     
    Donc près de 200k pas dans la marche aléatoire.
    Où ces promenades se sont-elles terminées?
     

    allwalkdata(end,:)
    ans =
    Columns 1 through 11
    -636.58 -541.39 -1000.9 -436.61 356.79 -157.98 -161.44 478.41 -65.325 -624.95 -795.86
    Columns 12 through 22
    -569.76 -169.58 37.705 -373.35 -193.1 -316.91 -69.306 -430.6 -140.92 247.08 -143.95
    Columns 23 through 33
    -339.97 -59.332 173.08 288.98 -78.927 -546.23 26.17 81.455 25.087 399.69 83.686
    Columns 34 through 44
    520.92 -158.04 690.7 430.35 837.11 604.51 -459.4 369.44 47.953 17.497 265.34
    Columns 45 through 55
    -73.708 171.93 -502.52 -436.02 213.63 -327.65 439.4 -595.36 -689.5 -609.44 -487.53
    Columns 56 through 66
    56.602 -341.29 391.56 -345.06 104.16 324 407.17 396.58 -186.36 320.52 127.96
    Columns 67 through 77
    -126.18 515.95 326.52 -160.58 -291.39 -671.77 375.42 161.05 -215.69 -709.72 -169.1
    Columns 78 through 88
    442.65 206.96 -366.62 296.44 -68.06 85.838 180.54 93.865 343.9 36.668 196.27
    Columns 89 through 99
    3.2942 253.73 503.08 482.23 -498.44 149.07 -615.69 144.99 55.706 501.4 -208.14
    Columns 100 through 101
    -306.1 -342.34