2011-01-25 4 views
1

J'ai les éléments suivants dans mathematica et je veux l'utiliser dans matlab.J'ai essayé mais j'ai des erreurs et je ne peux pas les corriger.C'est que je ne reçois pas encore la philosophie matlab! Ainsi,conversion de mathematica en matlab -> (appendto)

intMC = {}; sigmat = {}; 
Do[np1 = np + i*100; 
    xpoints = Table[RandomReal[], {z1, 1, np1}]; 
    a1t = Table[f[xpoints[[i2]]], {i2, 1, np1}]; 
    a12 = StandardDeviation[a1t]/Sqrt[Length[a1t]]; 
    AppendTo[intMC, {np1, Mean[a1t], a12}]; 
    AppendTo[sigmat, {np1, a12}], 
    {i, 1, ntr}]; 

Je l'ai fait:

[email protected] (x) exp(-x.^2); 

    intmc=zeros(); 
    sigmat=zeros(); 

    for i=1:ntr 
     np1=np+i*100; 
     xpoints=randn(1,np1); 
     for k=1:np1 
     a1t=fx(xpoints(k)) 
     end     %--> until here it prints the results,but in the 
           %end it gives 
           % me a message " Attempted to access xpoints(2,:); 
           %index out of bounds because size(xpoints)=[1,200] 
           %and stops executing. 

    %a1t=fx(xpoints(k,:)) % -->I tried this instead of the above but 
    %a1t=bsxfun(@plus,k,1:ntr) % it doesn't work 

     a12=std(a1t)/sqrt(length(a1t)) 
     intmc=intmc([np1 mean(a1t) a12],:) %--> i can't handle these 3 and 
     sigmat=sigmat([np1 a12 ],:)  %as i said it stopped executing 

    end 

Répondre

2

Pour ajouter un scalaire à un tableau Matlab, vous pouvez appeler soit array(end+1) = value ou array = [array;value] (remplacer le point-virgule par une virgule si vous voulez un Tableau 1-by-n). Ce dernier fonctionne également pour ajouter des tableaux; pour ajouter des tableaux avec le premier, vous appelez array(end+1:end:size(newArray,1),:) = newArray au cas où vous voulez caténater le long de la première dimension. Cependant, ajouter des boucles qui font plus que, disons, 100 itérations est une mauvaise idée dans Matlab, car elle est lente. Il vaut mieux d'abord pré-affecter le tableau - ou mieux encore, vectoriser le calcul pour ne pas avoir à boucler du tout. Si je vous ai bien compris, vous voulez calculer la moyenne et la MEB à partir d'un nombre croissant d'échantillons d'une distribution normale. Voici comment vous pouvez le faire avec une boucle:

intmc = zeros(ntr,3); %# stores, on each row, np1, mean, SEM 
sigmat = zeros(ntr,2); %# stores, on each row, np1 and SEM 

for i=1:ntr 
%# draw np+100*i normally distributed random values 
np1 = np+i*100; 
xpoints = randn(np1,1); 
%# if you want to use uniform random values (as in randomreal), use rand 
%# Also, you can apply f(x) directly on the array xpoints 

%# caculate mean, sem 
m = mean(xpoints); 
sem = std(xpoints)/sqrt(np1); 

%# store 
intmc(i,:) = [np1, m, sem]; 
sigmat(i,:) = [np1,sem]; 

end %# loop over i 
+0

Merci pour votre réponse Jonas Vous étiez très helpful.I ne peut pas comprendre une partie though.How nous appliquons directement f (x) sur le tableau xpoints.I Je n'arrive pas à comprendre pourquoi nous n'utilisons pas sth comme: fx (xpoints (k)). – George

+0

@George: xpoints est un tableau. Les opérations mathématiques sont appliquées élément par élément sur un tableau (notez que si une opération a une signification spéciale lin linéaire algèbre, comme la multiplication, vous devez utiliser '. *' 'Au lieu de' * 'pour obtenir un comportement par élément). 'exp (-x.^2)' fonctionne sur chaque élément du tableau, donc vous pouvez juste passer un tableau pour 'x', et n'avez pas besoin d'une boucle. – Jonas

+0

oui, mais pour que exp (-x.^2) fonctionne sur chaque élément du tableau xpoints, ne devons-nous pas mettre l'exp (-x.^2) sur le tableau? – George