python - 通过适用于 Python 的 MATLAB API 时方矩阵展平为行向量

标签 python matlab matlab-engine

我有一个包含协方差数据的数据框,因此我们有一个方阵。我将此数据框转换为 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]])

关于python - 通过适用于 Python 的 MATLAB API 时方矩阵展平为行向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65998813/

相关文章:

python - 将多个时间序列数据组合到一个 2d numpy 数组

javascript - 使用 D3.js 的极坐标图

matlab - 创建两个不同随机整数的优雅方式

algorithm - 修改 Delaunay 三角剖分的有效方法

c++ - 轻松将 OpenCV C++ 变量发送到 Matlab 的分步指南

python - 如何计算多个列表中 n 元语法的出现次数

python - 如何在 Python 中合并来自 3 个不同列表的嵌套子列表的元素?

python - pandas:将空数据帧写入HDF文件

c++ - 使用 engine.h 时,让 Matlab 在命令行窗口中显示错误和输出

c++ - 从 DLL 调用 MATLAB