我在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:使用==>时出错双
如果我这样做:
measure =rand()-0.5
m=10000;
data=rand(1,m)-0.5
然后,我在plot1中得到了正确的结果,但是在图2中,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')
我得到一个空矩阵,没有情节..
答案 0 :(得分:1)
由于@Itamar基本上回答了你的第一个问题,这里是对第二个问题的评论。你做得差不多了。你需要定义
Walk1D = @ (n) cumsum(steps(n));
因为cumsum
是FoldList[Plus,0,your-list]
的直接类比。然后,代码中的plot
可以正常工作。另外,请注意,在Mathematica或Matlab代码中,没有必要单独定义LastPoint1D
- 在这两种情况下,它都是生成列表的最后一点(向量)steps
。
编辑:
在LastPoint1D
上扩展一点:我的猜测是你想让它成为Walk1D
计算的步行的最后一点。因此,IMO有意义只是让它成为生成的walk(vector)的函数,它返回它的最后一个点。例如:
lastPoint1D = @(walk) (walk(end));
然后,您将其用作:
walk = Walk1D(10000);
lastPoint1D(walk)
HTH
答案 1 :(得分:0)
你有一些错误/错误将你的代码翻译成Matlab:
data = Table[measure, {m}];
会创建m
measure
个副本,在您的情况下会创建一个大小为(1,m)的随机向量。如果这是真的,那么在Matlab中它只是data = measure(m);
m
,因此在调用它时使用矩阵表示法(:
)是没有意义的。for
循环内的矩阵中,如果您事先分配矩阵,它将运行得更快,否则Matlab将重新分配内存以调整矩阵大小在每次迭代中。您可以通过data = zeros(1,m);
执行此操作。 修改强>
关于你的第二个问题,如果你用文字描述你想要实现的目标,而不是试图阅读你的(产生错误的)代码,那么帮助你会更容易。明显错误的一件事是使用像0:steps(n)
这样的表达式,因为你使用m:n
和两个标量m
和n
来生成一个向量,但steps(n)
会产生矢量,而不是标量。您可能得到一个空矩阵,因为steps(n)
返回的向量中的第一个值可能为-1,而0:-1
生成一个空向量。