Struct 倍频程中类似熊猫的对象:通过对其他字段进行操作,将字段添加到结构中
我希望以与python pandas类似的方式在倍频程中进行操作。 我得出结论,在八度音阶中,与数据帧最相似的对象是结构 我有几个相关的问题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)。 我想我可以像上面那样使用循环,但我想避免
mystr
中的其他字段进行操作(逐行),在structmystr
中创建新字段“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;