Python 我怎样才能告诉MATLAB我导入的数据是一系列向量,而不仅仅是一系列字母?
我使用python在MATLAB中获得了一个项目的数据。我有3个不同的矩阵,分别是mxn、mxn+1和mxn+2。我在pythonPython 我怎样才能告诉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
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