MATLAB - 访问python列表和元组

时间:2016-03-17 19:08:55

标签: matlab

我有一个python函数Foo,它返回一个包含3个列表的元组。每个列表包含我想在matlab中操作和绘制的点。目前,我可以使用

检索我的数据
data = py.Foo.main(args)

绘制输出证明很困难。 Matlab将“​​数据”视为python对象。我以前很匆忙,我的快速工作是

function [r] = convertToVector(c)
%make sure everything is numeric so I can plot it
r = [];
for i = 1:length(c)
    if isnumeric(c{i})
        r = [r c{i}];
    end
end

filler = data.cell()
a = convertToVector(filler{1}.cell())
b = convertToVector(filler{1}.cell())
c = convertToVector(filler{1}.cell())

这样可行,但c我有类似

的内容
filler.cell{3}.cell = [0] [-1] [-1] [-1] [0.22] [0.13] [0.08]

当我运行convertToVector时,一切都是0或-1。我不知道发生了什么事。如果我在控制台玩游戏,我可以得到像

这样的东西
r = [];
z = filler.cell{3}.cell;
r = [r z{1}]      >>> r = 0
r = [r z{2}]      >>> r = 0 -1
r = [r z{5}]      >>> r = 0 -1 0

为什么会这样?如果我分别用z{1} z{2} z{5}替换0 -1 0.22,我会得到我期望的结果:r = 0 -1 0.22。我不经常使用matlab,我不知道是什么原因造成的。我试图将在python中完成的分析结果插入到预先存在的matlab gui中,否则我会避免将这两者连接起来。

修改:在使用whos r进一步检查时,在首先添加int64时{}为z{1} to z{4},在首先添加double时{0}}。如果我添加z{5}

,该课程将从double更改为int64

1 个答案:

答案 0 :(得分:1)

根据您的编辑,似乎问题是每个单元格中的初始整数(在python中存储为select empid, case kpiname when 'Kpi1' then sum(kpivalue) end as 'Kpi1', case kpiname when 'Kpi2' then sum(kpivalue) end as 'Kpi2' from [Kpis] where kpiname in ('Kpi1', 'Kpi2') and date = 20160310 and hour = 8 group by empid, kpiname, hour int类型)不会自动转换为{{1这似乎是合理的。如果您将numpy.uint64连接到double数组,则double将转换为uint64,而不是其他方式。这只是令人惊讶,因为MATLAB非常严重地默认使用double,所以你可能不会期望这样。

简单的无python演示:

uint64

在此之后,所有三个数组都将具有double类。好吧,这个例子有点多余,因为a = uint64([3, 4, 5]); b = [a, 6]; c = [b, 7.3]; uint64,所以如果有任何类型转换,那么class(6)就已经发生了。

解决方案很简单:在函数中明确地转换为double

b