2015-05-28 45 views
1

假設我有以下MATLAB代碼:表和變量名 - MATLAB

clear; clc 

Items = {'counter','item1', 'item2', 'item3', 'item4'}; 

a = rand(8,4); 
j = (1:8)'; 

t = table(j,a(:,1), a(:,2), a(:,3), a(:,4),'VariableNames',Items) 

我想知道如果有一個複雜的方式,如果我有例如擴展這個列表20個項目。按照這段代碼,我應該在table之內包括每一個a(:,i), i = 1,...,20,再加上我將不得不爲Items列表做同樣的處理。我想有一個比這更方便的方法。

回答

1

array2table

a = rand(8,4); 

[l, w] = size(a); 

j = 1:l; 
Items = cell(1, w + 1); 
Items{1} = 'counter'; 

for ii = 2:length(Items) 
    Items{ii} = sprintf('item%u', ii - 1); 
end 

t = array2table([j', a], 'VariableNames', Items); 

編輯:好像有相關的大量的開銷與array2table。它本質上是mat2cell的一個包裝,所以單獨使用它並跳過所有錯誤檢查可能會帶來速度上的好處。雖然沒有測試過。

+0

這似乎是一個非常整潔的解決方案(這就是爲什麼upvote),但如何可以'項目'列表以自動方式更改? – thanasissdr

+0

@thanasissdr對不起,我錯過了這部分問題。我已經更新了我的答案 – excaza

1

您可以製作一個包含a中所有列的單元格。

for i=1:size(a,2) 
acell{end+1}=a(:,i); 
end 

,然後調用

table(j,acell{:},'VariableNames',Items) 

下面是一個例子:

Items = {'counter'}; 

a = rand(8,6); 
j = (1:8)' 

acell = []; 

for i=1:size(a,2) 
    acell{end+1}=a(:,i); 
    Items{end+1}=['item',num2str(i)]; 
end 
t = table(j,acell{:},'VariableNames',Items); 
+0

@simmons您是否嘗試過運行它?這裏可能會丟失一些東西。 – thanasissdr

+0

我添加了一個工作示例。你可以改變它的形狀,它應該可以工作。 – simmmons

+0

您正在調整每個循環迭代中的單元格數組,這在計算上效率非常低。你知道所有相關的維度來預先分配內存中的數組,並且應該這樣做。 – excaza