我的代码中有一个bug,我不知道在哪里!!![MATLAB]

我的代码中有一个bug,我不知道在哪里!!![MATLAB],matlab,Matlab,我正试图重现一个实验的结果。但到目前为止,我还没有成功。这是我写的代码 编辑:根据Zizy Archer的最初评论,该代码已被修订 但我得到的是: EDIT2:已删除代码段 谁能告诉我我的代码有什么问题吗? 提前谢谢大家 下次至少自己尝试一些基本的调试,找出可能的错误。 要调试,可能需要打印一些变量或绘图。放置一些条件以检查这些值是否符合预期或没有意义。如果您知道这么一小段代码中存在错误,这并不难。但是,如果您没有试图攻击的文件,这个错误可能已经潜伏了一段时间 那么,对于这种情况下的逐步解决方案

我正试图重现一个实验的结果。但到目前为止,我还没有成功。这是我写的代码

编辑:根据Zizy Archer的最初评论,该代码已被修订

但我得到的是:

EDIT2:已删除代码段

谁能告诉我我的代码有什么问题吗?
提前谢谢大家

下次至少自己尝试一些基本的调试,找出可能的错误。 要调试,可能需要打印一些变量或绘图。放置一些条件以检查这些值是否符合预期或没有意义。如果您知道这么一小段代码中存在错误,这并不难。但是,如果您没有试图攻击的文件,这个错误可能已经潜伏了一段时间

那么,对于这种情况下的逐步解决方案:

您立即注意到的是,如果您绘制alpha0est或beta0est,您对alpha的估计系统性地过高,在单轮情况下为1.015,而不是1.01,与beta类似。 那会是什么呢?很明显,这不是信号处理中的噪声或延迟,这一个显示为平均值周围的所有毛茸茸的东西,您可以将所有延迟设置为0来验证这一点。所以,它必须是其他的东西。 进一步看,您可以注意到,当您增加执行的轮数时,此系统错误正在减少,并且在整整30轮中消失

所以,它必须与你正在进行的回合数有关。现在尝试设置N=10而不是30,哇,现在10轮就可以了。这就是你的错误。等式13来自论文——这里有N个元素求和。等式16同样与N相乘。显然,N必须是相同的数字。但事实证明,在您的代码中它不是。在你的代码中,等式13是四舍五入的。可能是1,可能是30。方程式16乘以N=30,始终如此


如果您使用更为合理的变量名,所有这些都可以很容易地避免,真的吗?。如果您使用N表示执行的轮数,并将maxN作为您最多可以尝试执行的轮数的限制,那么您将很容易正确地得到它。

在您的代码中,延迟的平均值和SD以毫秒为单位;不是微秒。@SardarUsama因为我以微秒为单位测量时间,所以我将微秒表示为10^-3@SardarUsama抱歉,我的意思是,因为我是以毫秒为单位测量时间,我将µsec表示为10^-3@SardarUsama正如你所指出的,我已经试过了,但是我仍然无法再现结果。你没有根据你编辑的代码更新数据。您添加了文章中的快照,甚至没有提到要复制的文章。为你的问题添加适当的参考资料并使用适当的标题。我的错误是没有合适的标题。标题应该代表你在博文中尝试的内容谢谢你的指点。所以,我所做的是移除了内部for循环,这样A=sumT_2act1:ROUNDS+T_3act1:ROUNDS;变成A=T_2act+T_3act。同样适用于B、C和D。对代码的其余部分也进行了必要的修订。然而,我仍然无法得到预期的结果。“我已经一步一步地调试了它,但仍然无法解决它。@nashynash嗯,是的,但是T_2act在这一更改之后仍然有ROUNDS元素。alpha0est和beta0est使用N,N始终是30。你是在暗示T_2act应该是标量而不是向量吗?T_2act应该每轮都在变化,所以它是一个向量是有意义的。我在这里迷路了。@nashynash T2act是一个包含元素的向量,这一切都很好。因此,A,B,C,D都得到元素的总和。对于方程式16,alpha0est和beta0est,计算使用N=30。等式16中的N也需要是整数。啊哈!这就是问题所在。非常感谢您的时间和帮助。
clear;
Nmax        =  30;              % number of rounds
M           =  10000;           % number of simulations
beta0       =  5*10^-6;         % relative clock offset in micro seconds
alpha0      =  1.01;            % relative clock skew
for simN = 1:M

for N  = 1:Nmax

    mean_dly    =  randi([20 50],N,1).*10^-6;         % micro seconds
    stdd_dly    =  randi([1 5],N,1).*10^-6;           % micro seconds

    XpropDly    =  normrnd(mean_dly,stdd_dly,N,1);    % micro seconds
    YpropDly    =  normrnd(mean_dly,stdd_dly,N,1);    % micro seconds
    prcssTme    =  randi([100 500],N,1).*10^-6;       % micro seconds
    T_1         =  (1:N)'*10^-3;                         % milli seconds
    T_2         =  T_1 + XpropDly;                       % milli seconds
    T_3         =  T_2 + prcssTme;                       % milli seconds
    T_4         =  T_3 + YpropDly;                       % milli seconds

    % actual time
    T_2act      =  (T_1 + XpropDly).*alpha0 + beta0;
    T_3act      =  (T_4 - YpropDly).*alpha0 + beta0;

    % equation 13
    A           =  sum(T_2act(1:N) + T_3act(1:N));
    B           =  sum(T_1(1:N) + T_4(1:N));
    C           =  sum((T_2act(1:N) + T_3act(1:N)).^2);
    D           =  sum((T_2act(1:N) + T_3act(1:N)).*(T_1(1:N) + T_4(1:N)));

    % equation 16
    alpha0est(simN,N)     =  (A.^2-C.*Nmax)./(A.*B-D.*Nmax);
    beta0est(simN,N)      =  (B.*C-A.*D)./(2.*(A.*B-D.*Nmax));
end
timestamps            =  [T_1 T_2 T_3 T_4];
clear T_*;
end
% equation 29 and 30
MSE_alpha   =  sum((alpha0est - alpha0).^2)/M;
MSE_beta    =  sum((beta0est - beta0).^2)/M;

figure %2(a)
semilogy(1:Nmax,MSE_beta.*10^12)
xlabel('N');ylabel('MSE of the estimated offset \beta_{0}')
figure %2(b)
semilogy(1:Nmax,MSE_alpha)
xlabel('N');ylabel('MSE of the estimated skew \alpha_{0}')