Matlab fprintf in循环的意外行为



我在当前7个级别的嵌套for循环中重复执行不同值的计算。我的计算结果将被记录到一个文件中。因此,我使用fprintf。以下是我的代码摘录:

loadsignals;
fprintf('n');
logfile = fopen(logfilename,'w');
if (logfile == -1)
    error('Couldn''t open logfile!');
end
%%% Initialisation of variables %%%
for thresalgi=1:length(arrthresalg)
for thressigi=1:length(arrthressig)
    for diffalgi=1:length(arrdiffalg)
        for detectsigi=1:length(arrdetectsig)
            for windowsizei=1:length(arrwindowsize)
                for windowshapei=1:length(arrwindowshape)
                    for Ki=1:length(arrK)
                        %% Prepare this round
                        thresalg  = arrthresalg{thresalgi};
                        thressig  = arrthressig{thressigi};
                        diffalg   = arrdiffalg{diffalgi};
                        detectsig = arrdetectsig{detectsigi};
                        K = arrK;
                        if strcmpi(arrwindowshape{windowshapei},'rectangle')
                            window = ones(1,arrwindowsize(windowsizei));
                        end
                        if strcmpi(arrwindowshape{windowshapei},'saw')
                            window = (1:arrwindowsize(windowsizei))/arrwindowsize(windowsizei);
                        end
                        if strcmpi(arrwindowshape{windowshapei},'sraw')
                            window = (arrwindowsize(windowsizei):-1:1)/arrwindowsize(windowsizei);
                        end
                        if strcmpi(arrwindowshape{windowshapei},'exponential')
                            window = flip(exp(1:arrwindowsize(windowsizei))/exp(arrwindowsize(windowsizei)));
                        end
                        if strcmpi(arrwindowshape{windowshapei},'rexponential')
                            window = exp(1:arrwindowsize(windowsizei))/exp(arrwindowsize(windowsizei));
                        end
                        if strcmpi(arrwindowshape{windowshapei},'root')
                            window = flip(sqrt((1:arrwindowsize(windowsizei))/arrwindowsize(windowsizei)));
                        end
                        if strcmpi(arrwindowshape{windowshapei},'rroot')
                            window = sqrt((1:arrwindowsize(windowsizei))/arrwindowsize(windowsizei));
                        end
                        %% Detect events
                        detectEvents; % Remark: the variables top of this statement are changed in this script, may this cause issues?
                        %% Evaluate result
                        [fp,fn,tp,tn] = compareResults(solevts,y,tolerance);
                        results{thresalgi,thressigi,diffalgi,detectsigi,windowsizei,windowshapei,Ki} = {fp, fn, tp, fn};
                        fprintf(logfile,sprintf('Thresalg: %s Thressig: %s Diffalg: %s Detectsig: %s Winsize: %d Winshape: %s K: %f done.n     FP: %d FN: %d TP: %d TN: %dn', thresalg, thressig, func2str(diffalg), detectsig, arrwindowsize(windowsizei), arrwindowshape{windowshapei}, K,int32(fp),int32(fn),int32(tp),int32(tn)));
                    end
                end
            end
        end
    end
end
end

当我让它运行并打开生成的文件时,我得到了第一次迭代的第一行的正确结果,但是第二行和以下所有内容都很奇怪:

Thresalg: meanval Thressig: d Diffalg: @(x)fwpdiff(x) Detectsig: s Winsize: 2 Winshape: rectangle K: 0.100000 done.
     FP: 1.246905e-01 FN: 1.554772e-01 TP: 1.938653e-01 TN: 2.417315e-01
Thresalg: 3.014163e-01 Thressig: 3.758374e-01 Diffalg: 4.686335e-01 Detectsig: 5.843414e-01 Winsize: 7.286182e-01 Winshape: 9.085176e-01 K: 1.132835 done.
     FP: 1.412538e+00 FN: 1.761300e+00 TP: 2.196174e+00 TN: 2.738420e+00

对我来说,似乎只有传递给fprintf的指针在数据写入缓冲区时不再有效。这可能吗?

我试图找到一个更简单的例子来重现这个问题,但无法创建一个。

有人已经发生过类似的事情吗?或者我的代码中有一个(微不足道的)错误?

谢谢你的帮助!

我想知道问题是否与变量K有关?最内层的for循环为

for Ki=1:length(arrK)

,然后在循环体中设置

K = arrK;

所以现在一个局部变量被设置为数组,可以有一个或多个数字。fprintf

fprintf(logfile,sprintf('Thresalg: %s Thressig: %s Diffalg: %s Detectsig: %s Winsize: %d 
    Winshape: %s K: %f done.n     FP: %d FN: %d TP: %d TN: %dn', thresalg, thressig, 
    func2str(diffalg), detectsig, arrwindowsize(windowsizei), 
    arrwindowshape{windowshapei}, K,int32(fp),int32(fn),int32(tp),int32(tn)));

注意,K在第一行末尾作为浮点数写入字符串。如果K是一个数组,这可以解释为什么FP, FN, TPTN被写为浮点数而不是整数(根据%d)。我认为代码应该将Ki写成整数而不是K

试着做出改变,看看会发生什么!

还请注意,您不需要使用sprintf来创建传递给fprintf的字符串。你可以直接写

fprintf(logfile,'Thresalg: %s Thressig: %s Diffalg: %s Detectsig: %s Winsize: %d 
    Winshape: %s K: %f done.n     FP: %d FN: %d TP: %d TN: %dn', thresalg, thressig, 
    func2str(diffalg), detectsig, arrwindowsize(windowsizei), 
    arrwindowshape{windowshapei}, K,int32(fp),int32(fn),int32(tp),int32(tn));

as fprintf接受与sprintf相同的输入(格式字符串和参数变量列表),在文件标识符(logfile)之后。

最新更新