MATLAB动态创建变量遇问题:assignin函数无法生成变量求助
动态读取文本生成MATLAB变量的assignin优化问题
需求与现状
需要从指定格式的文本文件中读取数据,动态创建对应的MATLAB变量。原switch-case代码可实现需求,但代码冗余;尝试用assignin函数简化时,确认函数执行但未生成目标变量。
文本文件内容
object crop_image.nii plane 3 coeff -5.046e-19 3.168e-13 -5.716e-8 0.005 2.746 amax 1 nfact 1 pt .9906 suvr 1 regi 1
原switch-case实现代码
readin = readlines(insert text file name here); for i = 1:length(readin) this = split(readin(i))'; switch this(1) case 'object' object = this{2}; case 'plane' plane = str2double(this{2}); case 'coeff' coeff = str2double(this(2:end)); case 'suvr' suvr = str2double(this{2}); case 'amax' amax = str2double(this{2}); case 'nfact' nfact = str2double(this{2}); case 'pt' pt = str2double(this{2}); case 'regi' regi = str2double(this{2}); otherwise fprintf('Invalid delimiter: %s! Please check your text file.\n', this{1}); return; end end
用户尝试的assignin优化代码(存在问题)
if ismember(this(1), ["object", "plane", "coeff", "suvr", "amax", "nfact", "pt", "regi"]) if isa(this(2), 'string') assignin('base', this(1), this(2)); else assignin('base', this(1), str2double(this(2:end))); end else fprintf('Invalid delimiter: %s! Please check your text file.\n', this(1)); return; end
问题原因
- 变量名类型不匹配:
split函数返回的是string数组,this(1)是string类型,但assignin要求第二个参数(变量名)必须是字符向量(char),直接传递string会导致变量无法正确创建。 - 判断逻辑无效:
isa(this(2), 'string')永远为真(因为split的结果全是string),导致需要转数值的变量(如plane、coeff)也被赋值为string,不符合需求。
修正方案
方案1:修正assignin代码(生成独立变量)
readin = readlines('your_file.txt'); % 替换为实际文件名 valid_keys = ["object", "plane", "coeff", "suvr", "amax", "nfact", "pt", "regi"]; for i = 1:length(readin) this = split(readin(i)); key = this(1); if ismember(key, valid_keys) % 将string类型的键转为char,满足assignin的参数要求 key_char = char(key); if key == "object" % 仅object项保留字符串类型 assignin('base', key_char, this(2)); else % 其余项统一转换为数值(支持多元素如coeff) values = str2double(this(2:end)); assignin('base', key_char, values); end else fprintf('Invalid delimiter: %s! Please check your text file.\n', char(key)); return; end end
方案2:用结构体存储(更安全,推荐)
动态生成独立变量容易污染工作区,推荐用结构体统一存储所有参数:
readin = readlines('your_file.txt'); params = struct(); valid_keys = ["object", "plane", "coeff", "suvr", "amax", "nfact", "pt", "regi"]; for i = 1:length(readin) this = split(readin(i)); key = this(1); if ismember(key, valid_keys) key_char = char(key); if key == "object" params.(key_char) = this(2); else params.(key_char) = str2double(this(2:end)); end else fprintf('Invalid delimiter: %s! Please check your text file.\n', char(key)); return; end end
使用时直接调用params.object、params.coeff即可。
内容的提问来源于stack exchange,提问作者Bell
相关产品推荐
相关产品推荐

