【问题标题】:Processing string of 3D variables in MATLAB在 MATLAB 中处理 3D 变量字符串
【发布时间】:2023-03-31 13:05:02
【问题描述】:

我一直在尝试编写一个脚本来处理一串 3D 变量,eV50eV60eV70 等(意思是从195019601970 中提取的值以此类推。这些3D变量的大小为31x145x192。)转换成一串3D输出,即m1m2m3等(尺寸为1x145x192)。

这对你们中的一些人来说可能很简单,但在过去的 24 小时里,我一直在努力解决这个问题。我通过使用循环和 EVAL 尝试了这两种方法,但是我无法理解表达式中的 '' 括号,所以我想这就是我无法正确平衡方程的原因。

*X为数据集eV50eV60eV70等(表示从195019601970等中提取的值)

基本上我试图把这个脚本变成一个循环或类似的东西:

'[m1 v1] = extfunc (eV50);
[ m2 v2 ] = extfunc ( eV60 ) ;
[ m3 v3 ] = extfunc ( eV70 ) ;
[ m4 v4 ] = extfunc ( eV80 ) ;
[ m5 v5 ] = extfunc ( eV90 ) ;
[ m6 v6 ] = extfunc ( eV100 ) ;
等等... '


方法一:

'[mean vars] = eval(['extfunc( sprintf(',eV%d', (50:10:80)') ')']); '


方法二:

*我已将eV50eV60eV70重命名为eV1eV2eV3等等...

' for i=1:6

m(i)=extfunc_h(sprintf('eV%d', i));

结束'

extfunc 的用法:-

[mean variance] = extfunc(eV50)

在方法 1 中,我有不平衡方程和方法 2,MATLAB 返回了错误消息

???索引超出矩阵维度。


【问题讨论】:

    标签: string matlab variables


    【解决方案1】:

    方法 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)维矩阵”之前误导“of”->“or”]

    针对已编辑的问题进行编辑: 虽然 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 和不同的变量名是比在一个矩阵中收集eV50eV60 等更优雅的解决方案,例如eV(:,:,:,1) = eV50; eV(:,:,:,2) = eV60; 等或一个元胞数组并在那个数组上工作,除非您的原始数据源确实是一个带有如此命名变量的 MATLAB 二进制文件。

    【讨论】:

    • 数据源是一个结构,包含一个56940x145x192的变量,即使我正在使用一个相对强大的UNIX版本的Matlab(认为它有8TB的内存),它也无法加载。另一方面,我对贴花时间尺度感兴趣,所以我可以在贴花期间组织数据。然后这些变量得到处理各种功能,如统计分析拟合和提取。在您的帮助下,我可以轻松更改函数和变量,然后将它们作为批处理进行。谢谢你。这是很大的帮助,我现在对 EVAL 和 SPRINTF 有了更好的理解。
    【解决方案2】:

    不太清楚extfunc 的输入应该是什么(X 是什么) - 它是单个变量,即 ev50,还是变量列表?

    无论如何,第一种方法的问题是sprintf 产生以下字符串:

    ,eV50,eV60,eV70,eV80
    

    所以你在乞讨时有一个额外的,。此外,它仅适用于extfunc 获取变量列表作为输入的情况。否则,您应该重新格式化您的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多