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 это лучший выбор.

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