2011-02-14 3 views
0

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

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

MATLAB:

measure [email protected] (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 в двойной: Ошибка использования ==> двойной

Если я сделать:

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

тогда я получить правильные результаты в Plot1, но в участке 2, у = ось неверна.

Кроме того, если у меня есть это в 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 [email protected] (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') 

и я получаю пустую матрицу и не сюжет ..

+0

Пожалуйста, опишите, что вы на самом деле хотите сделать. – InsertNickHere

+0

Я хочу, чтобы выше работали, но, как я уже сказал, они этого не делают. – George

ответ

1

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

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

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

EDIT:

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

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

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

walk = Walk1D(10000); 
lastPoint1D(walk) 

HTH

+0

Здравствуйте, теперь это сработало, но результат LastPoint1D (10000) всегда «1» или «-1», когда я запускаю программу. В математике, когда я оцениваю nb, каждый раз в широком диапазоне он принимает разные числа. – George

+0

@George См. Обновление к моему сообщению. –

+0

Хорошо, теперь все в порядке! Но я не могу понять, почему, если я это делаю: LastPoint1D (10000) не делает то же самое, что: walk = Walk1D (10000); LastPoint1D (ходить). Большое вам спасибо! – George

0

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

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

EDIT

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

+0

Hello.The data = measure (m) работал нормально, но все еще проблема с plot2.I означает, что бары, которые я беру с графика, имеют высоту около 1000. Но в математике высота составляет около 500. Также, если вы мог бы сказать мне, что я могу сделать со второй проблемой ... Спасибо большое! – George

+0

Высота баров зависит от «ширины бункера», которую вы определяете, а значение по умолчанию, вероятно, отличается от Mathematica до Matlab. Вы можете использовать 'hist (x, n)' или 'hist (x, binVals)' в Matlab, чтобы указать количество ящиков или центров bin. Что касается второго вопроса, я отредактирую свой ответ. –

+0

Хорошо с этим, я использовал hist (данные, 20). – George

Смежные вопросы