我一直在尝试编写一个脚本来处理一系列3D变量,eV50
,eV60
,eV70
等等(意味着从1950
中提取的值,1960
,1970
等。这些3D变量的大小为31x145x192。)为一串3D输出,即m1
,m2
,{{ 1}}等等(尺寸为1x145x192)。
对于你们中的一些人来说这可能非常简单,但是在过去的24小时内我一直在努力让自己的头发发挥作用。我通过使用循环和EVAL尝试了这两种方法,但是我很难理解表达式中的''括号,所以我想这就是为什么我无法正确平衡方程式。
* X是数据集m3
,eV50
,eV60
等(意味着从eV70
,1950
中提取的值,{{1等等。)
基本上我正在尝试将此脚本转换为循环或某种类似的循环:
'[m1 v1] = extfunc(eV50);
[m2 v2] = extfunc(eV60);
[m3 v3] = extfunc(eV70);
[m4 v4] = extfunc(eV80);
[m5 v5] = extfunc(eV90);
[m6 v6] = extfunc(eV100);
等等...
“
方法1:
'[mean vars] = eval(['extfunc(sprintf(',eV%d',(50:10:80)')')']); “
方法2:
*我已将1960
,1970
,eV50
重命名为eV60
,eV70
,eV1
等等......
'对于i = 1:6
m(i)= extfunc_h(sprintf('eV%d',i));
结束'
extfunc的用法: -
eV2
在方法1中,我有不平衡方程式和方法2,MATLAB返回错误信息
???指数超过矩阵维度。
答案 0 :(得分:1)
方法1的一个问题是每个'开始或结束一个字符串,但是你希望它们中的一些成为应该生成的字符串的一部分。你需要两个'为此:
[mean vars] = eval(['extfunc( sprintf('',eV%d'', (50:10:80)'') '')']);
这仍然不会做你想要的。如果你想为50:10:80
的每个元素生成一个字符串,你需要一个循环。
第二种方法的问题可能是你的extfunc
返回了一个向量/数组/矩阵(对于mean
;请注意,你没有以这种方式记录variance
),但你的assigment m(i)= ...
只能采用标量值。如果mean
是向量,请尝试m(i,:)=...
。
但是,我宁愿质疑你在这里处理字符串和eval
的一般方法。如果重命名变量很容易,为什么不将它们放入单元格数组或(n + 1)维矩阵中,让函数处理实际变量内容而不是变量名字符串?
[编辑:误导“ - ”> “或”之前的“(n + 1)维矩阵”]
编辑以回复已修改的问题: 虽然SO的目的不是让别人做你的工作,但你想要的东西似乎很简单:
year = 50:10:100;
for i=1:length(year)
cmdstr = ['[m' int2str(i) ' v' int2str(i) '] = extfunc(eV' int2str(year(i)) ');'];
eval(cmdstr);
end
如果您因某种原因更喜欢sprintf
来查看数组连接,请尝试
cmdstr = sprintf('[m%d v%d]=extfunc(eV%d);',i,i,year(i))
代替。我仍然不相信使用eval
和不同的变量名称比在一个矩阵中收集eV50
,eV60
等更优雅地解决您的问题。除了你的原始数据源确实是一个带有如此命名的变量的MATLAB二进制文件之外,eV(:,:,:,1) = eV50; eV(:,:,:,2) = eV60;
等或单元格数组工作。
答案 1 :(得分:1)
目前还不清楚extfunc
的输入是什么(X
) - 它是单个变量,即ev50
,还是变量列表?
无论如何,第一种方法的问题是sprintf
产生以下字符串:
,eV50,eV60,eV70,eV80
所以你在乞讨时有额外的,
。此外,仅当extfunc
获取变量列表作为输入时,它才适合。否则,您应该重新格式化字符串。