Игорь Сделай новую волну

У меня 2 волны данных. Z_EC - это число протонов, N_EC - число нейтронов, а EC_pure - помеченная волна, основанная на определенных периметрах, IE отмечает "1", если соответствует критериям, "0", если нет.

Я пытаюсь создать новую протонную и нейтронную волну, которая будет иметь правильные значения в зависимости от того, является ли EC_pure 1 или 0 (если 1 соответствует P и N; если 0 ничего не делает). Однако каждый раз, когда я запускаю свою функцию, новые волны заполняют значения P и N, даже если EC_pure = 0.

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

2 ответа

Решение
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. Выполнено.

Другая возможность - дублировать волны и назначить NaN, если EC_Pure == 0, а затем zapnans.

Другие вопросы по тегам