如何告诉MATLAB我导入的数据是一系列向量,而不仅仅是一系列字母?

时间:2013-05-29 12:43:19

标签: python matlab matrix vector

我已经使用python为MATLAB中的项目获取了我的数据。我有3个不同的矩阵mxn,mxn + 1和mxn + 2矩阵。我在python scipy.io.savemat('set1.mat', mdict ={'abc1':abc1})中使用了这个命令。矩阵的每一行实际上应该是一行行向量(长度为p)而不是标量,因此矩阵实际上是mx(n)*pmx(n+1)*pmx(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是矢量的名称?

2 个答案:

答案 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(),我总是建议避免这种情况。