2

我已经使用 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

现在,如果我使用 load 导入数据,我可以抓取abc1(1,:). 这给了我:

ans = A B C

或者我可以采取:

abc1(1,1)    
ans = A

我怎样才能让它识别出 A 是向量的名称?

4

2 回答 2

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 是邪恶的。

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

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 列,您可以使用该cat函数迭代地执行此操作。例如:

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
于 2013-05-29T14:32:14.890 回答
0

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

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

但是,如果您继续以上述方式构建项目,您可能会遇到eval(),我始终建议您避免。

于 2013-05-29T14:23:08.867 回答