String MATLAB中三维变量字符串的处理
我一直在尝试编写一个脚本来处理一个3D变量字符串,String MATLAB中三维变量字符串的处理,string,matlab,variables,String,Matlab,Variables,我一直在尝试编写一个脚本来处理一个3D变量字符串,eV50,eV60,eV70,等等(意思是从1950,1960,1970等中提取的值。这些3D变量的大小为31x145x192。)转换成一个3D输出字符串,即m1,m2、m3等(尺寸为1x145x192) 对你们中的一些人来说,这可能非常简单,但我在过去24小时里一直在努力让这一切正常进行。我通过使用循环和求值尝试了这两种方法,但在理解表达式中的“”括号时遇到了困难,因此我想这就是我无法正确平衡方程式的原因 *X是数据集eV50,eV60,eV7
eV50
,eV60
,eV70
,等等(意思是从1950
,1960
,1970
等中提取的值。这些3D变量的大小为31x145x192。)转换成一个3D输出字符串,即m1
,m2
、m3
等(尺寸为1x145x192)
对你们中的一些人来说,这可能非常简单,但我在过去24小时里一直在努力让这一切正常进行。我通过使用循环和求值尝试了这两种方法,但在理解表达式中的“”括号时遇到了困难,因此我想这就是我无法正确平衡方程式的原因
*X是数据集eV50
,eV60
,eV70
等(表示从1950
,1960
,1970
等中提取的值)
基本上,我正在尝试将此脚本转换为循环或类似的内容:
'[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: “[平均变量]=eval(['extfunc(sprintf('eV%d',(50:10:80)'));”
方法2: *我已经将
eV50
,eV60
,eV70
重命名为eV1
,eV2
,eV3
等等
“因为i=1:6
m(i)=extfunc_h(sprintf('eV%d',i))
结束'
extfunc的用法:-
[mean variance] = extfunc(eV50)
在方法1中,我使用了不平衡方程,在方法2中,MATLAB返回了错误消息
???索引超出了矩阵维度。”
方法1的一个问题是,每个“开始”或结束一个字符串,但您希望其中一些是应该生成的字符串的一部分。为此,您需要两个:
[mean vars] = eval(['extfunc( sprintf('',eV%d'', (50:10:80)'') '')']);
这仍然不能满足您的要求。如果希望为50:10:80
的每个元素生成字符串,则需要一个循环
第二种方法的问题可能是extfunc
返回向量/数组/矩阵(对于mean
;请注意,您不以这种方式记录variance
),但您的赋值m(i)=……
只能取标量值。如果mean
是一个向量,请尝试m(i,:)=…
然而,我宁愿质疑您处理字符串和eval
的一般方法。如果重命名变量很容易,为什么不将它们放入单元格数组或(n+1)维矩阵中,让函数处理实际变量内容而不是变量名字符串
[编辑:误导性的“->”或“之前”(n+1)-维度矩阵”]
编辑以回答已编辑的问题:
虽然这样做的目的不是让其他人做你的工作,但你想要的似乎很简单:
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
等更优雅地解决您的问题,例如eV(:,:,:,1)=eV50;eV(:,:,:,2)=eV60除非您的原始数据源确实是一个MATLAB二进制文件,其中包含名为thusly的变量。不太清楚什么应该输入到extfunc
(什么是X
)-它是一个单变量,即ev50
,还是一个变量列表
无论如何,第一种方法的问题是sprintf
生成以下字符串:
,eV50,eV60,eV70,eV80
所以你在乞讨处有一个额外的,
。此外,它仅适用于extfunc
获取变量列表作为输入的情况。否则,您应该重新格式化字符串。数据源是一个包含56940x145x192变量的结构,即使我正在使用一个功能相对强大的UNIX版本的Matlab(认为它有8TB内存),它也无法加载。另一方面,我对贴花时间尺度感兴趣,所以我可以在贴花期间组织数据。这些变量然后得到各种处理函数,如统计分析拟合和提取。在您的帮助下,我可以轻松地更改函数和变量,然后将它们作为批处理过程来执行。谢谢你,阿恩!这是很大的帮助,我现在对EVAL和SPRINTF有了更好的理解。