2014-02-17 90 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