Igor Pro 8,比较字符串的函数
Igor Pro 8, functions for comparing strings
您好,我刚开始使用 Igor Pro。我正在寻找有关编写任务过程的帮助。
我有 4 个 wave,两个是文本 wave,两个是数字 wave(其中一个还没有数据)。我需要编写一个函数来比较两个文本 wave,如果它们相等,则让 igor 从其中一个数字 wave 中提取数据并将其放在正确的点以匹配与之耦合的文本 wave。
在视觉上概念化
twave1 twave2
nwave1 nwave2
twave1 是直到镎的所有同位素的列表,但它们没有按顺序排列,nwave1 是它们对应的质量值。 (都在表 1 上)
twave2 是相同的同位素列表,但顺序正确(即 1H、2H、3H、4H...3He、4He...等),nwave2 为空(均在表 2 中)
所以目标是创建一个函数来对 twave1 和 twave2 进行排序,如果它们匹配,则将数据从 nwave1 提取到 nwave2,以便质量与表 2 上的正确同位素匹配。因此 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
如果我没理解错的话,你最后要的两波是isotope
和ME
。您的代码几乎可以正常工作,但是您需要在声明文本 wave 时使用 /t 标志告诉 Igor 这是一个文本 wave。我进一步简化了代码:
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 需要 match/no-match,因此 !cmpstr
是更好的选择。
您好,我刚开始使用 Igor Pro。我正在寻找有关编写任务过程的帮助。
我有 4 个 wave,两个是文本 wave,两个是数字 wave(其中一个还没有数据)。我需要编写一个函数来比较两个文本 wave,如果它们相等,则让 igor 从其中一个数字 wave 中提取数据并将其放在正确的点以匹配与之耦合的文本 wave。
在视觉上概念化
twave1 twave2
nwave1 nwave2
twave1 是直到镎的所有同位素的列表,但它们没有按顺序排列,nwave1 是它们对应的质量值。 (都在表 1 上)
twave2 是相同的同位素列表,但顺序正确(即 1H、2H、3H、4H...3He、4He...等),nwave2 为空(均在表 2 中)
所以目标是创建一个函数来对 twave1 和 twave2 进行排序,如果它们匹配,则将数据从 nwave1 提取到 nwave2,以便质量与表 2 上的正确同位素匹配。因此 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
如果我没理解错的话,你最后要的两波是isotope
和ME
。您的代码几乎可以正常工作,但是您需要在声明文本 wave 时使用 /t 标志告诉 Igor 这是一个文本 wave。我进一步简化了代码:
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 需要 match/no-match,因此 !cmpstr
是更好的选择。