Матричные матрицы и список сгибов - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть две проблемы в Mathematica и я хочу сделать их в Matlab:

measure := RandomReal[] - 0.5
m = 10000;
data = Table[measure, {m}];
fig1 = ListPlot[data, PlotStyle -> {PointSize[0.015]}]
Histogram[data]

Matlab:

measure =@ (m) rand(1,m)-0.5
m=10000;
for i=1:m
data(:,i)=measure(:,i);
end

figure(1)
plot(data,'b.','MarkerSize',0.015)

figure(2)
hist(data)

И это дает мне:

???Произошла следующая ошибка при преобразовании из function_handle в double: Ошибка использования ==> double

Если я сделаю:

measure =rand()-0.5
    m=10000;
data=rand(1,m)-0.5

, тогда я получу правильные результаты в plot1, но в plot2 ось y = неверна.

Кроме того, если у меня есть это в Mathematica:

steps[m_] := Table[2 RandomInteger[] - 1, {m}]
steps[20] 
Walk1D[n_] :=  FoldList[Plus, 0, steps[n]]
LastPoint1D[n_] := Fold[Plus, 0, steps[n]]
ListPlot[Walk1D[10^4]]

Я сделал это:

steps = @ (m) 2*randint(1,m,2)-1;
steps(20)

Walk1D =@ (n) cumsum(0:steps(n))  --> this is ok i think
LastPointold1D= @ (n) cumsum(0:steps(n))
LastPoint1D= @ (n) LastPointold1D(end)-->but here i now i must take the last "folding"
Walk1D(10)
LastPoint1D(10000)
plot(Walk1D(10000),'b')

, и я получаю пустойматрица и без сюжета ..

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Поскольку @Itamar по существу ответил на ваш первый вопрос, вот комментарий ко второму.Вы сделали это почти правильно.Вам необходимо определить

Walk1D = @ (n) cumsum(steps(n));

, поскольку cumsum является прямым аналогом FoldList[Plus,0,your-list].Тогда plot в вашем коде работает нормально.Также обратите внимание, что в коде Mathematica или Matlab нет необходимости определять LastPoint1D отдельно - в обоих случаях это последняя точка вашего сгенерированного списка (вектор) steps.

РЕДАКТИРОВАТЬ:

Расширение немного на LastPoint1D: я предполагаю, что вы хотите, чтобы это была последняя точка прогулки, вычисленная по Walk1D.Следовательно, IMO имеет смысл просто сделать его функцией сгенерированного обхода (вектора), который возвращает свою последнюю точку.Например:

lastPoint1D = @(walk) (walk(end));

Затем вы используете его как:

walk = Walk1D(10000);
lastPoint1D(walk)

HTH

0 голосов
/ 14 февраля 2011

У вас есть несколько ошибок / ошибок при переводе вашего кода в Matlab:

  • Если я не ошибаюсь, строка data = Table[measure, {m}]; создает m копий measure, что в вашем случаесоздаст случайный вектор размером (1, м).Если это правда, в Matlab это будет просто data = measure(m);
  • Функция, которую вы определяете, получает единственный аргумент m, поэтому нет смысла использовать матричную нотацию (:) при ее вызове.
  • Так же, как примечание: если вы вставите данные в матрицу внутри цикла for, он будет работать намного быстрее, если вы заранее выделите матрицу, в противном случае Matlab будет перераспределять память для изменения размера.матрица в каждой итерации.Вы делаете это data = zeros(1,m);.
  • Что вы подразумеваете под "на графике 2 ось y = неверна"?Что вы ожидаете, что это будет?

РЕДАКТИРОВАТЬ

Что касается вашего второго вопроса, было бы легче помочь вам, если вы опишите в словах, что вы хотитечтобы достичь, а не пытаться прочитать ваш код (код ошибки).Одна вещь, которая явно неправильна, это использование выражения типа 0:steps(n), поскольку вы используете m:n с двумя скалярами m и n для получения вектора, но steps(n) создает вектор, а не скаляр.Вы, вероятно, получите пустую матрицу, поскольку первое значение в векторе, возвращаемое steps(n), может быть -1, а 0:-1 создает пустой вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...