伊戈尔掀起新浪潮

Igor Make a new wave

我有2波数据。 Z_EC 是质子数,N_EC 是中子数,EC_pure 是基于特定周长的标记波,即如果符合标准则标记“1”,否则标记“0”。

我正在尝试制作一个新的质子和中子波,该波将根据 EC_pure 是 1 还是 0(如果 1 匹配 P 到 N;如果 0 什么都不做)具有正确的值.但是,每次我 运行 我的函数时,即使 EC_pure = 0

,新波也会填充 P 和 N 值
Function plotECzn()
    wave EC_pure, Z_EC, N_EC
    variable i, j
    variable len = numpnts(Z_EC)
    Duplicate/O Z_EC Z_pure
    Duplicate/O Z_EC N_pure
    For(i=0; i<len; i+=1)
     For(j=0; j<121; j+=1)
        If(EC_pure[j] == 1)
        Z_pure[i] = Z_EC[i]
        N_pure[i] = N_EC[i]
        
    Endif
 Endfor
Endfor 
End
Function ListECzn()
    WAVE EC_pure, Z_EC, N_EC
    wavestats/Q EC_pure
    variable N_Candidates = V_Sum
    Make/O/D/N=(N_Candidates) Z_pure, N_pure    
    variable Len = NumPnts(EC_pure)
    variable i
    variable j = 0
    For(i=0; i<Len; i+=1)
        If(EC_pure[i] == 1)
            Z_pure[j] = Z_EC[i]
            N_pure[j] = N_EC[i]
            j += 1
        EndIf
    EndFor
End

更简洁的写法是:

Function ListECzn()
    WAVE EC_pure, Z_EC, N_EC
    variable Len = NumPnts(EC_pure)
    Make/O/D/N=(Len) Z_pure, N_pure
    Z_pure[] = (EC_pure[p] == 1) ? Z_EC[p] : NaN
    N_pure[] = (EC_pure[p] == 1) ? N_EC[p] : NaN
    WaveTransform zapnans Z_pure
    WaveTransform zapnans N_pure
End

这些条件赋值真的很有用。 Z_pure[] = (EC_pure[p] == 1) ? Z_EC[p] : NaN 的语法表示:将以下内容分配给 Z_pure 的每一行 - 如果 EC_Pure 为 1,则分配 Z_EC 值,否则分配 NaN。然后你只需删除 NaN。完成。

如果 EC_Pure == 0 然后是 zapnans,另一种可能性是复制 waves 并分配 NaNs。