通过 MATLAB API for Python 后方矩阵展平为行向量
Square matrix flattened to row vector upon passing through 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 而无需 reshape/resize 矩阵。
我试图做的和我得到的输出:
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]])
我有一个包含协方差数据的数据框,因此我们有一个方阵。我将这个数据框翻译成 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 而无需 reshape/resize 矩阵。
我试图做的和我得到的输出:
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]])