我已经使用python为MATLAB中的项目获取了我的数据。我有3个不同的矩阵mxn,mxn + 1和mxn + 2矩阵。我在python scipy.io.savemat('set1.mat', mdict ={'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
现在,如果我使用加载导入数据,我可以抓取abc1(1,:)
。这给了我:
ans = A B C
或者我可以接受:
abc1(1,1)
ans = A
如何让它识别出A是矢量的名称?
答案 0 :(得分:2)
根据我对你的问题的理解,听起来你有(在matlab中):
A = ones(1,5);
B = 2*ones(1,5);
C = 3*ones(1,5);
load('set1.mat');
然后你想做类似的事情:
D = [abc1];
,结果为abc1 = 'A B C'
,相当于[A B C]
。
有很多选择可以做到这一点。第一个也可能最简单的是使用eval,虽然我不禁提起它,因为大多数人都考虑eval to be evil。
在您的情况下,这将是:
D = eval(['[' abc1 ']']);
更好的解决方案是利用可以用结构完成的dynamic field names技巧:
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列,您可以使用cat
函数进行迭代。 e.g:
D = [];
for idx = 1:3
D = cat(2, D, foo.(abc1(1,idx)));
end
或者,如果您在创建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
答案 1 :(得分:0)
将数据加载到结构中并使用动态字段索引:
s = load('yourfile');
s.(abc1(1,1))
但是,如果您继续以上述方式构建项目,那么您可能会遇到eval()
,我总是建议避免这种情况。