conversione da Mathematica a MATLAB -> (appendTo)
-
24-10-2019 - |
Domanda
Ho il seguente in matematica e vuole utilizzarlo in matlab.I provato ma non ho errori e non può fissa them.It è che non ho ricevuto ancora la filosofia MATLAB! Così,
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}];
Ho fatto questo:
fx=@ (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
Soluzione
Al fine di accodare uno scalare a un array di Matlab, è possibile chiamare o array(end+1) = value
o array = [array;value]
(sostituire il punto e virgola con una virgola se si desidera un 1-by-n array). Quest'ultimo funziona anche per l'aggiunta array; per gli array di aggiunta con l'ex, che si definirebbe array(end+1:end:size(newArray,1),:) = newArray
nel caso in cui si desidera catenate lungo la prima dimensione.
Tuttavia, aggiungendo nei cicli che fanno più di, diciamo, 100 iterazioni, è una cattiva idea in Matlab, perché è lento. È meglio pre-assegnare la matrice prima -. O, meglio ancora, vettorizzazione il calcolo in modo che non c'è bisogno di ciclo a tutti
Se ho capito bene, si vuole calcolare media e SEM da un crescente numero di campioni da una distribuzione normale. Ecco come si può fare questo con un ciclo:
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