Igor Pro 8, функции для сравнения строк
Привет, я новичок в использовании Игоря Про. Мне нужна помощь в написании процедуры для задачи.
У меня 4 волны, две текстовые волны и две числовые волны (одна из которых еще не имеет данных). Мне нужно написать функцию, которая будет сравнивать две текстовые волны, и, если они равны, заставить igor извлекать данные из одной из числовых волн и помещать их в правильную точку, чтобы соответствовать текстовой волне, с которой они связаны.
Сделать визуально концептуально
twave1 twave2
nwave1 nwave2
twave1 - это список всех изотопов вплоть до нептуния, но они не в порядке, а nwave1 - их соответствующие значения массы. (оба на table1)
twave2 - тот же список изотопов, но упорядоченный должным образом (например, 1H, 2H, 3H, 4H...3He, 4He...ect), а nwave2 пуст (оба в table2)
поэтому цель состоит в том, чтобы создать функцию, которая будет сортировать twave1 и twave2, и, если они совпадают, перетащить данные из nwave1 в nwave2, чтобы массы совпадали с правильными изотопами в table2. Таким образом, table2 будет иметь правильно упорядоченные изотопы, а теперь и массовые данные в нужных местах.
Любая помощь будет принята с благодарностью; вот где я дошел
function assignMEf()
wave ME, ME_FRIB
wave isotope_FRIB, isotope
variable len = numpnts(ME)
variable i, j
variable ME_current, iso_current
for(i=0; i<len; i+=1)
ME_current = ME[i]
iso_current = isotope[i]
for(j=0; j<4254; j+=1)
if(iso_current == isotope_frib[j])
ME_frib = ME[i]
endif
endfor
endfor
end
2 ответа
Если я правильно понял, две волны, которые вам нужны в конце, это isotope
а также ME
. Ваш код был близок к работе, однако вам нужно сообщить Игорю, когда вы объявляете текстовую волну, что это текстовая волна, используя флаг /t. Я немного упростил код:
function assignMEf()
wave ME, ME_FRIB
wave/t isotope, isotope_FRIB
variable len = numpnts(ME)
variable i, j
for(i = 0; i < len; i += 1)
for(j = 0; j < len; j += 1)
if(stringmatch(isotope[i],isotope_frib[j]))
ME[i] = ME_FRIB[j]
endif
endfor
endfor
end
Этот код не очень надежен, но работает для того, что вы хотите делать.
Чтобы проверить код, вот мой MWE:
•Make/O/N=(10) ME_FRIB = p
•Make/O/N=(10) ME = NaN
•Make/O/N=(10)/T isotope_FRIB = "iso" + num2str(10 - p)
•Duplicate/O isotope_FRIB,isotope
•Sort isotope,isotope
•Edit isotope_FRIB,ME_FRIB,isotope,ME
•assignmef()
Я не думаю stringmatch
здесь правильный выбор. Он использует сопоставление с подстановочными знаками, но OP AFAIU хочет совпадения / отсутствия совпадения, поэтому!cmpstr
это лучший выбор.