我正在尝试在Matlab中运行时创建一个结构数组.
A= {'dark';'oa_45'; 'oa_225'};
for i = 1:3
tmp =load([folder '/' A{i} '.txt']);
eval([A{i} '.count=tmp(:,1:2)']);
eval([A{i} '.mean=mean(tmp(:,1:2),1)']);
eval([A{i} '.sqrtmean=sqrt(' A{i} '.mean)']);
eval([A{i} '.stdev=std(tmp(:,1:2),1)']);
eval(A{i});
end
因为我知道,使用eval是一个相当糟糕的做法,我想知道是否有一种简单的方法来避免eval.
我想可以在循环之前创建结构数组,然后只用括号表示法分配循环中的子字段:
s.(A{i}).count = ...
我在这里找到了一些建议说,似乎可以用subsasgn.这似乎比eval函数复杂得多.
有人知道一个简单的方法来避免eval函数,还是只是这里最好的调用?
我只是出于好奇,我想对于这三个向量,性能的损失并不重要.
最好的祝福,
MECHANIX
最佳答案 假设你有一个结构可以保存名为’dark’,’oa_45′,’oa_225’并且字段’sqrtmean’被放到底部的三个结构,你可能想要尝试这个 –
代码版本1(推荐)
A= {'dark';'oa_45'; 'oa_225'};
fieldnames1 = {'count';'mean';'stdev'};
funcnames1 = {'';'mean';'std'};
for k = 1:numel(A)
tmp =load([folder '/' A{k} '.txt']);
struct1 = A{k};
for i = 1:numel(fieldnames1)
if isempty(funcnames1{i})
comp_struct.(struct1).count=tmp(:,1:2);
else
fh = str2func(funcnames1{i});
comp_struct.(struct1).(fieldnames1{i}) = fh(tmp(:,1:2),1);
end
end
comp_struct.(struct1).sqrtmean = sqrt(comp_struct.(struct1).mean);
end
因此,’comp_struct.dark’将是您原来的“黑暗”等等.
更进一步,删除IF-ELSE –
代码版本2(强烈推荐)
A= {'dark';'oa_45'; 'oa_225'};
fieldnames1 = {'count';'mean';'stdev'};
funcnames1 = {'donothing';'mean';'std'};
for k = 1:numel(A)
tmp =load([folder '/' A{k} '.txt']);
struct1 = A{k};
for i = 1:numel(fieldnames1)
fh = str2func(funcnames1{i});
comp_struct.(struct1).(fieldnames1{i}) = fh(tmp(:,1:2),1);
end
comp_struct.(struct1).sqrtmean = sqrt(comp_struct.(struct1).mean);
end
不要忘记在路径中添加此功能 –
function out = donothing(varargin)
out = varargin{1};
如果嵌套循环困扰你或你不想进入函数句柄而你只是想用代码行占用相同空间的东西替换EVAL,请使用以下内容,但我不会建议一般情况下 –
代码版本3(不推荐)
A= {'dark';'oa_45'; 'oa_225'};
for k = 1:numel(A)
tmp =load([folder '/' A{k} '.txt']);
comp_struct.(A{k}).count = tmp(:,1:2);
comp_struct.(A{k}).mean = mean(tmp(:,1:2),1);
comp_struct.(A{k}).sqrtmean = sqrt(comp_struct.(A{k}).mean);
comp_struct.(A{k}).stdev = std(tmp(:,1:2),1);
end