преобразование из Mathematica в Matlab -> (приложение) - PullRequest
1 голос
/ 25 января 2011

У меня есть следующее в mathematica и я хочу использовать его в matlab. Я пытался, но у меня есть ошибки, и я не могу их исправить. Дело в том, что я еще не понял философию matlab!Итак,

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}];

Я сделал это:

  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

1 Ответ

2 голосов
/ 25 января 2011

Чтобы добавить скаляр в массив Matlab, вы можете вызвать либо array(end+1) = value, либо array = [array;value] (замените точку с запятой, если вам нужен массив 1 на n). Последний также работает для добавления массивов; чтобы добавить массивы к первому, вы должны позвонить array(end+1:end:size(newArray,1),:) = newArray на тот случай, если вы захотите соединиться по первому измерению.

Однако добавление в циклы, которые делают больше, чем, скажем, 100 итераций, является плохой идеей в Matlab, потому что это медленно. Лучше сначала предварительно назначить массив - или, что еще лучше, векторизовать вычисления, чтобы вам вообще не пришлось делать циклы.

Если я вас правильно понимаю, вы хотите рассчитать среднее значение и SEM из растущего числа выборок из нормального распределения. Вот как вы можете сделать это с помощью цикла:

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
...