Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct 倍频程中类似熊猫的对象:通过对其他字段进行操作,将字段添加到结构中_Struct_Field_Octave - Fatal编程技术网

Struct 倍频程中类似熊猫的对象:通过对其他字段进行操作,将字段添加到结构中

Struct 倍频程中类似熊猫的对象:通过对其他字段进行操作,将字段添加到结构中,struct,field,octave,Struct,Field,Octave,我希望以与python pandas类似的方式在倍频程中进行操作。 我得出结论,在八度音阶中,与数据帧最相似的对象是结构 我有几个相关的问题 如何通过对mystr中的其他字段进行操作(逐行),在structmystr中创建新字段“nf”? 比如说,对于字段a,b,我想得到nf=a^b。 到目前为止,我正在使用一个循环,如果可能的话,我的意思是避免 如何对移位的行进行操作? 比如说,对于a,b,我想得到nf[I]=a[I]^b[I-1](适当考虑I=1)。 我想我可以像上面那样使用循环,但我想避免

我希望以与python pandas类似的方式在倍频程中进行操作。 我得出结论,在八度音阶中,与数据帧最相似的对象是结构

我有几个相关的问题

  • 如何通过对
    mystr
    中的其他字段进行操作(逐行),在struct
    mystr
    中创建新字段“nf”?
    比如说,对于字段
    a
    b
    ,我想得到
    nf=a^b
    。 到目前为止,我正在使用一个循环,如果可能的话,我的意思是避免
  • 如何对移位的行进行操作? 比如说,对于
    a
    b
    ,我想得到
    nf[I]=a[I]^b[I-1]
    (适当考虑
    I=1
    )。 我想我可以像上面那样使用循环,但我想避免它

  • 如何在固定行上操作? 比如说,对于
    a
    b
    ,我想得到
    nf[I]=a[I]^b[1]
    。 我想我可以像上面那样使用循环,但我想避免它


  • 这里有一种方法,只使用逗号分隔的列表和
    deal

    S = struct( 'a', {1, 2}, 'b', {3, 4} );            % create a struct array
    [ S.nf ] = deal( num2cell( [S.a] + [S.b] ){:} );   % deal to new field in array
    
    然而,我得到的印象是,你追求的是一行,而不是“效率”本身。不要。这太难看了。这里的for循环没有问题

    此外,我完全同意克里斯的评论。最好重新考虑一下你的方法。与尝试在结构数组上执行操作相比,执行以下代码可能更可取:

    S.a = [1,2];
    S.b = [2,4];
    S.nf = S.a + S.b;
    

    我急忙注意到,这实际上也是R中的数据帧:一组大小相同的向量,每个向量都由自己的字段名表示,封装在一个对象中,该对象允许您通过字段名访问每个数组。

    您不能像使用Python一样以八度音阶工作。八度音阶是一种不同的语言,具有不同的强度。不要试图将数据帧硬塞进结构中,这是不同的事情。如果
    a
    b
    是每个
    id
    的标量,则创建
    a
    值数组和
    b
    值数组,并使用这些数组。这就是八度音阶的强度,也是你应该在那里工作的方式。如果您不想使用阵列,为什么要使用倍频程?Total plug警告:来试试my吧,它提供了与Matlab兼容的数据帧外观
    对倍频程的支持。如果它做不到你想要的,请在问题页面上提交一个功能请求。octave forge中也有这个包。还有
    structfun
    ,它对结构中的所有字段执行操作。然而,真正的问题是,为什么要避免for循环?这是一种完全可以接受的方式。@CrisLuengo-我知道不同的语言有不同的优势。我知道我可以使用细胞阵列。我决定使用struct,因为它在了解其操作的所有细节之前已经命名了字段。但很可能最适合我需要的类是cell数组,在这种情况下,我会牺牲命名字段。当然,我不会来回转换。请注意其他评论,提到倍频程软件包可能会给我们提供最好的(或者正在实现这一目标)。没有任何东西可以阻止您创建一个函数
    addCalculatedField(s,'nf',@power,'a','b',…)
    ,它在引擎盖下以任何必要的方式执行此计算(包括,例如,for循环)。这将更加紧凑、可读性更好,而且是一个很好的软件工程,因为您还可以为它编写单元测试,以及将接口与实现分开。如果您的目标是为了“可读性目的”用一行程序替换for循环,我强烈建议您不要这样做;通常情况下,结果恰恰相反。我还没试过。但是,
    交易
    的方式似乎是合适的,而且是一条直线。另外,它似乎适用于(几乎?)我想使用的任何表达式/操作,即使您在示例中使用的总和非常简单。你同意吗?至于另一条路线,我已经有很多代码使用了发布的结构。。。更改所有这些都会非常麻烦。只要您最终得到一个单元格,您可以通过
    {:}
    交易
    生成一个逗号分隔的参数列表,那么是的,它就可以工作了。但正如我所说,我不一定认为这比for循环更清晰(我高度怀疑计算效率是否有任何提高,尽管我还没有进行基准测试)。
    S.a = [1,2];
    S.b = [2,4];
    S.nf = S.a + S.b;