方阵在通过 MATLAB API for Python 时展平为行向量

问题描述

我有一个保存协方差数据的数据框,因此我们有一个方阵。我将此数据帧转换为 numpy,然后列出如下,以便我可以将它与 matlab api 一起使用:

import matlab.engine
eng = matlab.engine.start_matlab()

covdata_list = covdata.values.tolist()
covdata_MATLAB = matlab.double(covdata_list)

然后我使用 matlab api 从 python 创建一个匿名函数,如下所示,这是有史以来最简单的任务:

eng.eval(f"obj_func = @(x) x;",nargout=0)

到目前为止一切都很好,但是当我发送以 MATLAB 格式翻译的协方差数据时,即 covdata_MATLAB 会发生以下情况:

returns = eng.eval(f'obj_func({covdata_MATLAB})',nargout=1)
eng.size(returns)
>>>> matlab.double([[1.0,15625.0]])

虽然:

eng.size(covdata_MATLAB)
>>>> matlab.double([[125.0,125.0]])

正如我们所见,它好像“拉平”了协方差并产生了一个 1 X (125*125) 的行向量。

是否有解决方法或我遗漏了什么?

解决方法

这不是上述问题的确切解决方案,但 - 我想说 - 而是一种解决方法,在我的情况下并考虑到我的编程目标。

因此,我们的目标是将变量传递给 MATLAB,而无需重新调整矩阵的形状/大小。

  • 我想做什么以及我得到的输出:

    returns = eng.eval(f'obj_func({covdata_MATLAB})',nargout=1)
    eng.size(returns)
    >>>> matlab.double([[1.0,117649.0]])
    

(117649.0 对应于 343x343,用于此示例的方阵;在初始 Q 我使用 125x125 因此使用 15625.0,我希望这很清楚)

  • 我现在所做的一切都有合适的大小:

    covdata_MATLAB = matlab.double(covdata_list)
    eng.size(covdata_MATLAB)
    >>>> matlab.double([[343.0,343.0]])
    
    eng.workspace['covariance'] = covdata_MATLAB 
    

如果我现在查看工作区,我可以看到以下内容:

enter image description here

这对我来说很方便,但对其他人来说可能不是解决方案。

调用时的最终结果:

returns = eng.eval(f'obj_func(covariance)',nargout=1) #be careful now you have to use the variable name defined in the MATLAB workspace,i.e covariance and not covdata_MATLAB
eng.size(returns)
>>>> matlab.double([[343.0,343.0]])