2015-05-28 36 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