Igor Pro 8, функции для сравнения строк - PullRequest
0 голосов
/ 29 мая 2020

Привет, я новичок в использовании Igor Pro. Мне нужна помощь в написании процедуры для задачи.

У меня 4 волны, две текстовые волны и две числовые c волны (одна из которых еще не имеет данных). Мне нужно написать функцию, которая будет сравнивать две текстовые волны, и, если они равны, заставить igor извлекать данные из одной из числовых c волн и помещать их в правильную точку, чтобы соответствовать текстовой волне, с которой они связаны.

Чтобы сделать это визуально концептуально

twave1                           twave2

nwave1                           nwave2

twave1 - это список всех изотопов до нептуния, но они не в порядке, а nwave1 - соответствующие им значения массы. (оба в таблице 1)

twave2 - это тот же список изотопов, но упорядоченный правильно (т.е. 1H, 2H, 3H, 4H ... 3He, 4He ... ect), а nwave2 пуст (оба в таблице2)

, поэтому цель состоит в том, чтобы создать функцию, которая будет сортировать 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 ]

0 голосов
/ 01 июня 2020

Я не думаю, что stringmatch - правильный выбор здесь. Он использует сопоставление с подстановочными знаками, но OP AFAIU хочет сопоставить / не сопоставить, поэтому !cmpstr - лучший выбор.

0 голосов
/ 30 мая 2020

Если я правильно понял, две волны, которые вам нужны в конце, - это 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()
...