我正在尝试将一个简单的 Mathcad 文件转换为 MATLAB 脚本,但我得到的结果很奇怪。rand函数有什么不同吗?我是否忘记了与这两种环境不同的重要内容?
这是 Mathcad 文件的样子:
这是我目前正在使用的代码:
clear all
clc
N=100;
data=poissrnd(1000,N,N);
data2=zeros(N);
for l=1:N
for k=1:N
drozp=zeros(1,3);
eta_fot=data(l,k);
for m=1:eta_fot
ran=rand(1);
if ran<0.25
drozp(1)=drozp(1)+1;
elseif ran>=0.75
drozp(3)=drozp(3)+1;
else
drozp(2)=drozp(2)+1;
end
end
if (k>1) && (k<N)
data2(l,k)=data2(l,k)+drozp(2);
data2(l,k-1)=data2(l,k-1)+drozp(1);
data2(l,k+1)=data2(l,k+1)+drozp(3);
elseif k==1
data2(l,k)=data2(l,k)+drozp(2);
data2(l,N)=data2(l,N)+drozp(1);
data2(l,k+1)=data2(l,k+1)+drozp(3);
else
data2(l,k)=data2(l,k)+drozp(2);
data2(l,1)=data2(l,1)+drozp(3);
data2(l,k-1)=data2(l,k-1)+drozp(1);
end
end
end
data2 = data2 - mean(data2(:));
data_w = (1/sqrt(N))*fftshift(fft(data2, [], 2));
NPS1=(abs(data_w)).^2;
NPS2=sum(NPS1);
NPS=(1/N)*NPS2;
plot(NPS)
现在,我知道它可以运行得更快,最初是这个块:
for m=1:eta_fot
ran=rand(1);
if ran<0.25
drozp(1)=drozp(1)+1;
elseif ran>=0.75
drozp(3)=drozp(3)+1;
else
drozp(2)=drozp(2)+1;
end
end
看起来像这样:
[~,R] = histc(rand(1,eta_fot),cumsum([0;w(:)./sum(w)]));
R=a(R);
drozp=histc(R,a)
在哪里:
a=1:3;
w=[0.25,0.5,0.25];
但是我试图更接近 Mathcad 文件。然后我得到的结果(无论我用哪种方式)看起来都很糟糕。见下图。
我可以得到与 Mathcad 文件类似的结果的唯一方法是将整个 rand 循环更改为 'rigid' drozp(1)=0.25*eta_fot
,但它drozp(2)=0.5*eta_fot
与drozp(3)=0.25*eta_fot
概率无关了。然后,rand 循环看起来(至少在功能上)就像 Mathcad 中使用的那样,所以我不知道出了什么问题。
有什么我想念的吗?有什么我不明白的吗?我不知所措。