基于多表列名实现MATLAB动态变量赋值的问题
基于MATLAB表格列名创建动态变量的问题
问题描述
我需要基于数据集表格的列名创建动态变量,当前测试代码能生成目标变量名,但赋值为x^2,实际需求是将变量赋值为对应表格的列数据,期望生成类似imu1_accel_x0这样的变量,其值为对应表格列的全部数据。
原测试代码
varnammes = ["SpeedGoatT" "imu1_accel_x" "imu1_accel_y" "imu1_accel_z" "imu1_gyro_x" "imu1_gyro_y" "imu1_gyro_z" "imu1_orient_i" "imu1_orient_j" "imu1_orient_k" "imu1_orient_r" "imu2_accel_x" "imu2_accel_y" "imu2_accel_z" "imu2_gyro_x" "imu2_gyro_y" "imu2_gyro_z" "imu2_orient_i" "imu2_orient_j" "imu2_orient_k" "imu2_orient_r" "imu3_accel_x" "imu3_accel_y" "imu3_accel_z" "imu3_gyro_x" "imu3_gyro_y" "imu3_gyro_z" "imu3_orient_i" "imu3_orient_j" "imu3_orient_k" "imu3_orient_r" "imu4_accel_x" "imu4_accel_y" "imu4_accel_z" "imu4_gyro_x" "imu4_gyro_y" "imu4_gyro_z" "imu4_orient_i" "imu4_orient_j" "imu4_orient_k" "imu4_orient_r" "imu5_accel_x" "imu5_accel_y" "imu5_accel_z" "imu5_gyro_x" "imu5_gyro_y" "imu5_gyro_z" "imu5_orient_i" "imu5_orient_j" "imu5_orient_k" "imu5_orient_r" "imu6_accel_x" "imu6_accel_y" "imu6_accel_z" "imu6_gyro_x" "imu6_gyro_y" "imu6_gyro_z" "imu6_orient_i" "imu6_orient_j" "imu6_orient_k" "imu6_orient_r" "imu7_accel_x" "imu7_accel_y" "imu7_accel_z" "imu7_gyro_x" "imu7_gyro_y" "imu7_gyro_z" "imu7_orient_i" "imu7_orient_j" "imu7_orient_k" "imu7_orient_r"]; Tables = struct(); for i = 1:length(files) load(files(i)) varName = sprintf('Table0%d', i-1); % Create a variable name Tables.(varName) = logsout.FileLogSignals{4}.Values;% Set the variable in the structure Tables.(varName) = timeseries2timetable(Tables.(varName)); Tables.(varName) = timetable2table(Tables.(varName)); Tables.(varName) = splitvars(Tables.(varName), 2); Tables.(varName).Properties.VariableNames(2:end) = varnammes; for x = 1:length(varnammes) % this is the problem: varName = [char(varnammes(x)) num2str(i-1)]; eval([varName ' = x^2;']); % end end
常规正确赋值写法
imu1_accel_x = Tables.Table00{:,3}; % 或者 imu1_accel_x = Tables.Table00.imu1_accel_x;
我尝试将eval语句改为以下代码但报错,需要正确的实现方式:
eval([varName ' = Tables.Table00.imu1_accel_x;']);
解决方案
1. 修复eval的实现方式
错误原因是硬编码了表格名Table00和列名,没有动态关联当前循环的表格和列。修改内层循环代码如下:
for x = 1:length(varnammes) % 生成带后缀的目标变量名 targetVarName = [char(varnammes(x)) num2str(i-1)]; % 动态获取当前循环的表格名 currentTableName = sprintf('Table0%d', i-1); % 构造动态赋值语句 eval([targetVarName ' = Tables.' currentTableName '.' char(varnammes(x)) ';']); end
2. 更优方案:避免使用eval
eval会降低代码可读性且调试困难,推荐用结构体统一管理动态变量:
% 提前创建结构体存储所有动态变量 DynamicVars = struct(); for i = 1:length(files) load(files(i)) currentTableName = sprintf('Table0%d', i-1); Tables.(currentTableName) = logsout.FileLogSignals{4}.Values; Tables.(currentTableName) = timeseries2timetable(Tables.(currentTableName)); Tables.(currentTableName) = timetable2table(Tables.(currentTableName)); Tables.(currentTableName) = splitvars(Tables.(currentTableName), 2); Tables.(currentTableName).Properties.VariableNames(2:end) = varnammes; for x = 1:length(varnammes) varKey = [char(varnammes(x)) num2str(i-1)]; % 将数据存入结构体,无需eval DynamicVars.(varKey) = Tables.(currentTableName).(char(varnammes(x))); end end
后续可通过DynamicVars.imu1_accel_x0直接访问对应数据,比全局变量更安全易维护。
内容的提问来源于stack exchange,提问作者Tondre Benjamin D
相关产品推荐
相关产品推荐

