【问题标题】:Creating a massive matrix, selecting specific rows from a file创建一个巨大的矩阵,从文件中选择特定的行
【发布时间】:2019-04-22 19:58:51
【问题描述】:

我有一堆 mat 文件,其中包含大量行形式的数据序列(每个文件中有 7 行 x 160000 个样本)。我需要从某些行创建一个矩阵。

我使用以下代码加载文件:

files = dir ('*.mat');
data = load (files(1).name);
for k = 2:numel(files);
  data (k) = load (files(k).name);
end 

所以我将 mat 文件中的所有数据整齐地组织在一个结构数组中。 然后我使用这种代码来创建一个矩阵:

A = [data(1).mydata(7,:); data(2).mydata(7,:); data(3).mydata(7,:); ...
     data(4).mydata(7,:); data(5).mydata(7,:); data(6).mydata(7,:); ...
     data(7).mydata(7,:); data(8).mydata(2,:); data(9).mydata(2,:); ...
     data(10).mydata(2,:)];  %data matrix

但是我有更多的文件,当我想创建一个不同的矩阵时,我必须手动更改 50 - 70 个数字,这段代码变得庞大,很容易出错。

有没有其他方法可以做到这一点,比如索引我需要前 21 个字段的第 2 行和后面 21 个字段的第 7 行?

或者我是否需要从一开始就以不同的方式加载文件?

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    如果您的每个 MAT 文件中都有一个变量 mydata,我将按如下方式加载它们:

    files = dir ('*.mat');
    data = cell(numel(files),1);
    for k = 1:numel(files);
      tmp = load(files(k).name);
      data{k} = tmp.mydata;
    end
    

    索引现在更容易了。

    例如,您可以使用 cellfun 从元胞数组中的每个元素中提取第 7 行:

    A = cellfun(@(d)d(7,:),data,'UniformOutput',false');
    A = cat(1,A{:});
    

    从前 7 个元素中提取第 7 行,从其余元素中提取第 2 行:

    A1 = cellfun(@(d)d(7,:),data(1:7),'UniformOutput',false');
    A2 = cellfun(@(d)d(2,:),data(8:end),'UniformOutput',false');
    A = cat(1,A1{:},A2{:});
    

    【讨论】:

    • 非常感谢您的回答!因此,以元胞数组而不是结构体数组的形式加载数据可以更轻松地对其应用函数。谢谢!
    • @Vitto:结构体有一个structfun 等价物,但它遍历结构体的字段,而不是数组元素。因此,在这种情况下,使用结构数组会更复杂一些,仅仅是因为您没有有意义地使用这些字段(您只有一个字段)。如果您的问题涉及多个字段(从每个文件加载多个变量),那么答案可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多