Python 我怎样才能告诉MATLAB我导入的数据是一系列向量,而不仅仅是一系列字母?

Python 我怎样才能告诉MATLAB我导入的数据是一系列向量,而不仅仅是一系列字母?,python,matlab,matrix,vector,Python,Matlab,Matrix,Vector,我使用python在MATLAB中获得了一个项目的数据。我有3个不同的矩阵,分别是mxn、mxn+1和mxn+2。我在pythonscipy.io.savemat('set1.mat',mdct={'abc1':abc1})中使用了这个命令。矩阵的每一行实际上应该是行向量(长度为p)而不是标量,因此矩阵实际上是mx(n)*p,mx(n+1)*p和mx(n+2)*p 作为一个例子,我在MATLAB文件的顶部定义了这两种情况 A = ones(1,5) B = 2*ones(1,5) C = 3*o

我使用python在MATLAB中获得了一个项目的数据。我有3个不同的矩阵,分别是mxn、mxn+1和mxn+2。我在python
scipy.io.savemat('set1.mat',mdct={'abc1':abc1})
中使用了这个命令。矩阵的每一行实际上应该是行向量(长度为p)而不是标量,因此矩阵实际上是
mx(n)*p
mx(n+1)*p
mx(n+2)*p

作为一个例子,我在MATLAB文件的顶部定义了这两种情况

A = ones(1,5)
B = 2*ones(1,5)
C = 3*ones(1,5)
现在,我可以直接在MATLAB中编写:

abc1 = [A B C]
这似乎很奇怪,却给了我想要的输出

abc1 =    
Columns 1 through 14    
     1     1     1     1     1     2     2     2     2     2     3     3     3     3
Column 15    
     3
现在,如果我使用load导入数据,我可以抓取
abc1(1,:)
。这给了我:

ans = A B C
或者我可以:

abc1(1,1)    
ans = A

我如何才能让它识别A是向量的名称

将数据加载到结构中并使用动态字段索引:

s = load('yourfile');
s.(abc1(1,1))

但是,如果您继续以上述方式构建项目,您可能会遇到
eval()
,我一直建议您避免这种情况。

根据我对您的问题的理解,您似乎有(在matlab中):

然后你想做一些事情,比如:

D = [abc1];
对于
abc1='abc'
,结果等于
[abc]

这样做有很多选择。第一个可能也是最简单的是使用EVE,尽管我不敢提及它,因为大多数人都在考虑。

在您的情况下,这看起来像:

D = eval(['[' abc1 ']']);
更好的解决方案是利用结构可以实现的技巧:

foo.A = ones(1,5);
foo.B = 2*ones(1,5);
foo.C = 3*ones(1,5);

load('set1.mat'); 

D = [foo.(abc1(1,1)) foo.(abc1(1,2)) foo.(abc1(1,3))];
或者,如果需要连接3个以上的列,则可以使用函数间接连接。e、 g:

D = [];
for idx = 1:3
    D = cat(2, D, foo.(abc1(1,idx)));
end
或者,如果您在创建D之前就知道它的长度,您可以使用稍微高效的版本:

D = zeros(1, num_elements);
ins_idx = 1;
for idx = 1:3
    temp_num = length(foo.(abc1(1,idx)));
    D(ins_idx:(ins_idx+temp_num-1)) = foo.(abc1(1,idx));
    ins_idx = ins_idx + temp_num;
end

太好了,谢谢你。此foo解决方案按原样工作。唯一的问题是,我用我的项目的一个简化例子问了这个问题。大约有30000个数据条目,所以像这样编写“D”将在脚本上花费大量的时间和空间。我将尝试处理您向我展示的内容,但我只是在等待一些稍微修改的数据通过,以便我可以这样做。同时,对于如何更简洁地加载如此多的数据,您有什么建议吗?我添加了一些关于如何编写“D”的替代示例,这可能会有所帮助。
D = zeros(1, num_elements);
ins_idx = 1;
for idx = 1:3
    temp_num = length(foo.(abc1(1,idx)));
    D(ins_idx:(ins_idx+temp_num-1)) = foo.(abc1(1,idx));
    ins_idx = ins_idx + temp_num;
end