2014-02-17 92 views
0

假设我们已加载数据到单元阵列:动态变量声明

DATA={'foo',[1,5];'bar',[2,6]} 

有没有办法如何声明由第一列中DATA命名为第二列的内容变量?

回答

1

有一个assignin函数,它接受一个变量名,并为其分配一个特定的值:

for r = 1:size (DATA, 1) 
    assignin ('caller', DATA{r,:}); 
end 
+0

这不会在一个功能正常工作。或者更糟糕的是,它会产生意想不到的结果:变量将被分配在“base”中,而不是在函数的上下文中:O – Shai

+0

@Shai ups!你是对的。我误解了'base'和'caller',我认为调用者在堆栈中下了1级,并且基于当前范围。 – carandraug

5

你可以做,使用eval

for ii = 1:size(DATA,1) 
    eval([DATA{ii,1}, ' = ', num2str(DATA{ii,2})]); 
end 

然而,使用evalnot recommended

可以使用动态字段名改为:

s = cell2struct(DATA(:,2), DATA(:,1), 2); 
+1

这不会涵盖变量不是矢量的情况,例如ND矩阵(甚至2D矩阵),单元阵列,结构等。 – carandraug

+1

+1有时'eval'是要走的路线 –

+0

@carandraug you是对的。我使用'num2str'而不是我个人最喜欢的'sprintf'来覆盖简单的向量。但'eval'在这里确实有局限性。也许与'disp'结合?我更喜欢动态名称结构... – Shai