【问题标题】:Table and variable names - matlab表和变量名 - matlab
【发布时间】:2016-11-18 07:12:50
【问题描述】:

假设我有以下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 列表执行相同的操作。我想还有比这更方便的方法。

【问题讨论】:

    标签: matlab


    【解决方案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 的包装器,因此单独使用它并跳过所有错误检查可能会带来速度优势。不过还没有测试过。

    【讨论】:

    • 这似乎是一个非常巧妙的解决方案(这就是投票的原因),但Items 列表如何以自动方式更改?
    • @thanasissdr 抱歉,我错过了问题的那一部分。我已经更新了我的答案
    【解决方案2】:

    您可以创建一个包含所有列的单元格。

    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);
    

    【讨论】:

    • @simmons 你试过运行它吗?这里可能缺少一些东西。
    • 我添加了一个工作示例。您可以更改 a 的形状,它应该可以工作。
    • 您在每次循环迭代中调整元胞数组的大小,这在计算上是极其低效的。您知道在内存中预分配数组的所有相关维度,并且应该这样做。
    • 当然可以,但是对于任何合理数量的列,这并不重要。
    猜你喜欢
    • 2020-08-06
    • 2012-06-18
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多