我有一个包含协方差数据的数据框,因此我们有一个方阵。我将此数据框转换为 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
如果我现在查看工作区,我可以看到以下内容:
这对我来说很方便,但对其他人来说可能不是解决方案。
调用时的最终结果:
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]])
关于python - 通过适用于 Python 的 MATLAB API 时方矩阵展平为行向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65998813/