You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Python调用Matlab时出现数据库物种匹配失败问题求助

问题描述

背景信息

通过Python的matlab.engine调用第三方提供的Matlab脚本,实现化学物种向量与数据库的匹配检索,核心检索逻辑由外部团队开发。

物种向量示例

'O2  ','N2 ','H2O ','CO2 ','NH3  ','CH4 ','CO ','H2 ','H2S '
0.0000002 0.5 0.02 0.47 0.000000001 0.01 0.001 0.0001 3.13e-5

数据库示例(片段)

...
H2  33.19   1.313   -0.216
H2O 647.096 22.064  0.3449
H2O2    730.155 21.7    .358233
H2S 373.53  8.963   0.0942
NH3 405.65  11.28   0.2526
N2  126.2   3.4 0.0377
O2  154.58  5.043   0.0222
...

检索核心代码片段

q = size(n);
if q(1)>q(2)
    n=n';
end

for q = 1:length(names)                  % 遍历传入的每个物种
    index(q) = searchDataB(names(q));    % 获取物种在数据库中的索引

    if index(q) == -1                    % 若未找到则抛出异常
        throw(MException('Catling:missingSpecies',['Species ' names{q} ' is missing from the database.']))
    end
    %disp(['Using species: ' names(q)])   % 显示正在使用的物种

报错信息

Species N2  is missing from the database.

Error in Gibbs_energy_minimization>totalGibbsInternal (line 137)
    lnPhi = fugCoef(T,P,onlyPhase(1,names),onlyPhase(1,n'));

Error in Gibbs_energy_minimization (line 69)
    G1=totalGibbsInternal(n_true); % Calculate the total Gibbs energy of the true initial state.

Error in Main_script_iterate (line 27)
        vals=[vals; n Gibbs_energy_minimization(n')]; % run the Gibbs energy minimization routine and store the output in the vals array

Traceback (most recent call last):
  File "/home/tessa/Alien Earths/phi_calc/phi calc.py", line 181, in <module>
    phi=eng.Main_script_iterate()
  File "/usr/local/lib/python3.10/dist-packages/matlab/engine/matlabengine.py", line 71, in __call__
    _stderr, feval=True).result()
  File "/usr/local/lib/python3.10/dist-packages/matlab/engine/futureresult.py", line 62, in result
    return self.__future.result(timeout)
  File "/usr/local/lib/python3.10/dist-packages/matlab/engine/fevalfuture.py", line 76, in result
    self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
matlab.engine.MatlabExecutionError: 
  File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/fugCoef.m, line 32, in fugCoef

  File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Gibbs_energy_minimization.m, line 137, in totalGibbsInternal

  File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Gibbs_energy_minimization.m, line 69, in Gibbs_energy_minimization

  File /home/tessa/Alien Earths/phi_calc/Multiphase_disequilibrium/Main_script_iterate.m, line 27, in Main_script_iterate
Species N2  is missing from the database.

异常现象:仅'O2 '和'H2O '能正常匹配;本地Linux Mint系统的Matlab直接运行脚本也报错,但Matlab Online运行正常。


问题分析与解决方案

核心原因

问题本质是物种名称字符串的首尾空格匹配不一致:

  1. 物种向量中的每个名称都带有末尾空格(如'N2 '含1个末尾空格,'O2 '含2个末尾空格),但数据库中对应物种名称后的空格数量与向量不匹配(如N2后是2个空格)。
  2. searchDataB函数采用精确字符串匹配,空格数量不一致时直接匹配失败。
  3. Matlab Online默认对读取的字符串做了自动去空格处理(类似strtrim),而本地Matlab版本或数据库读取逻辑未做此处理,导致环境差异。

解决方案

方案1:修改Matlab检索代码,自动去除首尾空格

在调用searchDataB前,对每个物种名称执行strtrim(),去除首尾多余空格:

for q = 1:length(names)
    % 去除名称首尾空格后再检索
    trimmed_name = strtrim(names(q));
    index(q) = searchDataB(trimmed_name);
    
    if index(q) == -1
        throw(MException('Catling:missingSpecies',['Species ' trimmed_name ' is missing from the database.']))
    end
end

方案2:在Python端预处理物种名称

在Python构造物种名称向量时,先对每个字符串做strip处理,去除首尾空格后再传入Matlab:

# 假设原物种名称列表为species_names
trimmed_species = [name.strip() for name in species_names]
# 将处理后的名称传入Matlab引擎

方案3:修正数据库读取逻辑

检查数据库读取的Matlab代码,确保读取物种名称时自动去除首尾空格。例如使用textscan读取时:

fid = fopen('database.txt','r');
data = textscan(fid,'%s %f %f %f');
fclose(fid);
% 对物种名称列去空格
data{1} = strtrim(data{1});

内容的提问来源于stack exchange,提问作者Tessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:04:56