创建动态结构变量并保存
Create Dynamic structure variables and save them
我的程序输入是一个包含一些变量名称及其值的 csv 文件。
| var name | value |
| -------- | -------------- |
| a.b | 345 |
| a.c._0_.field1 | 322 |
| a.c._0_.field2 | 5 |
| a.c._1_.field1 | 32 |
| a.c._1_.field2 | 50 |
在我的代码中,我想读取此文件并使用文件中提到的值创建具有以下约束的结构变量。
- None 个变量名称已知。因此应该动态创建它们
- 所有子结构由
.
分隔
- 并且在数组的情况下,
_%d%_
提到了不同的索引。
在上述情况下,结构 a 将包含数据:
a.b = 345
a.c(1).field1 = 322
a.c(1).field2 = 5
a.c(2).field1 = 32
a.c(2).field2 = 50
如何创建名为 a
的结构并保存到 mat 文件?
我可以使用 eval
但是,由于不推荐这样做,我想知道是否可以使用 setfield
getfield
来实现
我假设您已经在此处将文件读入 MATLAB;您可以使用 strsplit()
to split your variable name on the dot, check whether the entry corresponds to a number or field name, and create your struct with those. You can use a substruct()
, in combination with subsref()
or subsasgn()
进行索引:
data = struct; % Initialise your final structure
% Insert a loop here over all your rows
parts = strsplit(my_str, '.'); % split your string
indx = struct;
for ii = 1:numel(parts)
if parts{ii}(1) ~= '_' || parts{ii}(end) ~= '_'
indx(ii).type = '.';
indx(ii).subs = parts{ii};
else
indx(ii).type = '()';
indx(ii).subs = {str2double(parts{ii}(2:end-1))};
end
end
data = subsasgn(data, indx, my_data);
我确实认为这是 XY problem。可能有更好的方法可以从您用于创建 CSV 的任何内容中导出数据,也可以有更好的方法将其加载到 MATLAB 中供以后使用。请首先说明您是如何创建 CSV 的,以及您希望如何处理 MATLAB(或 .mat 文件)中的数据。将 CSV 文件重新打包为 .mat 文件并不是您的目标。因此,请询问您的问题 (X),而不是您尝试的解决方案 (Y),以获得更有帮助的回复。
我的程序输入是一个包含一些变量名称及其值的 csv 文件。
| var name | value |
| -------- | -------------- |
| a.b | 345 |
| a.c._0_.field1 | 322 |
| a.c._0_.field2 | 5 |
| a.c._1_.field1 | 32 |
| a.c._1_.field2 | 50 |
在我的代码中,我想读取此文件并使用文件中提到的值创建具有以下约束的结构变量。
- None 个变量名称已知。因此应该动态创建它们
- 所有子结构由
.
分隔
- 并且在数组的情况下,
_%d%_
提到了不同的索引。
在上述情况下,结构 a 将包含数据:
a.b = 345
a.c(1).field1 = 322
a.c(1).field2 = 5
a.c(2).field1 = 32
a.c(2).field2 = 50
如何创建名为 a
的结构并保存到 mat 文件?
我可以使用 eval
但是,由于不推荐这样做,我想知道是否可以使用 setfield
getfield
我假设您已经在此处将文件读入 MATLAB;您可以使用 strsplit()
to split your variable name on the dot, check whether the entry corresponds to a number or field name, and create your struct with those. You can use a substruct()
, in combination with subsref()
or subsasgn()
进行索引:
data = struct; % Initialise your final structure
% Insert a loop here over all your rows
parts = strsplit(my_str, '.'); % split your string
indx = struct;
for ii = 1:numel(parts)
if parts{ii}(1) ~= '_' || parts{ii}(end) ~= '_'
indx(ii).type = '.';
indx(ii).subs = parts{ii};
else
indx(ii).type = '()';
indx(ii).subs = {str2double(parts{ii}(2:end-1))};
end
end
data = subsasgn(data, indx, my_data);
我确实认为这是 XY problem。可能有更好的方法可以从您用于创建 CSV 的任何内容中导出数据,也可以有更好的方法将其加载到 MATLAB 中供以后使用。请首先说明您是如何创建 CSV 的,以及您希望如何处理 MATLAB(或 .mat 文件)中的数据。将 CSV 文件重新打包为 .mat 文件并不是您的目标。因此,请询问您的问题 (X),而不是您尝试的解决方案 (Y),以获得更有帮助的回复。