Игорь Сделай новую волну
У меня 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.