Matlab 根据特定数组的长度对变量进行分组

Matlab 根据特定数组的长度对变量进行分组,matlab,struct,size,grouping,Matlab,Struct,Size,Grouping,我在数据集中有一个很长的变量列表,其中包含具有不同采样率的多个时间通道,例如时间1、时间2、时间、时间等。还有多个其他变量依赖于这两个时间中的任何一个 我想列出所有可能的通道,这些通道在工作区中包含“time”不区分大小写的部分字符串搜索,并根据变量的大小搜索和匹配属于此时间列表中每个项目的变量,然后将它们与变量的值组合在一个结构中以供以后分析 例如: Name Size Bytes Class ENGSPD

我在数据集中有一个很长的变量列表,其中包含具有不同采样率的多个时间通道,例如时间1、时间2、时间、时间等。还有多个其他变量依赖于这两个时间中的任何一个

我想列出所有可能的通道,这些通道在工作区中包含“time”不区分大小写的部分字符串搜索,并根据变量的大小搜索和匹配属于此时间列表中每个项目的变量,然后将它们与变量的值组合在一个结构中以供以后分析

例如:

  Name                     Size              Bytes  Class     

  ENGSPD_1            181289x1             1450312  double              
  Eng_Spd              12500x1              100000  double              
  Speed                41273x1              330184  double              
  TIME                 41273x1              330184  double              
  Time                 12500x1              100000  double              
  engine_speed_2        1406x1               11248  double              
  time_1              181289x1             1450312  double              
  time_2                1406x1               11248  double 
在本例中,我有4个具有不同名称和大小的时间通道和4个速度通道,它们属于每个时间通道


whos函数区分大小写,它只返回变量的名称,而不返回变量的值。

作为序言,我将回应上面的评论,以及这里的同事和其他类似问题的早期评论:

请停止以这种方式操纵数据

这在一开始可能是有道理的,但是,考虑到你迄今为止提出的问题,这不是你第一次遇到问题试图把所有事情都整合起来,如果你继续这样做,这也不会是最后一次。这种方法极易出错、不可靠且不可预测。该过程的每一步都要求您对数据进行假设,这些假设无法保证数据匹配的大小、变量的存在和可预测的命名等。。与其试图想出创造性的方法来整理数据,不如从头开始,以可预见的方式输出数据。这可能需要一些时间,但我保证这将在未来节省时间,无论谁在6个月内看到这一点,试图弄清楚到底发生了什么,这都是有意义的

例如,输出变量时完全不需要付出很大的努力:

outputstructure.EngineID.time = sometimeseries;
outputstructure.EngineID.speed = somedata;
其中EngineID可以是任何有效的变量名。这很简单,它可以将您的数据永久、可靠地链接在一起

也就是说,以下内容将为您的数据集带来一点理智:

% Build up a totally amorphous data set
ENGSPD_1       = rand(10, 1);
Eng_Spd        = rand(20, 1);
Speed          = rand(30, 1);
TIME           = rand(30, 1);
Time           = rand(20, 1);
engine_speed_2 = rand(5, 1);
time_1         = rand(10, 1);
time_2         = rand(5, 1);

% Identify time and speed variable using regular expressions
% Assumes time variables contain 'time' (case insensitive)
% Assumes speed variables contain 'spd', 'sped', or 'speed' (case insensitive)
timevars = whos('-regexp', '[T|t][I|i][M|m][E|e]');
speedvars = whos('-regexp', '[S|s][P|p][E|e]{0,2}[D|d]');

% Pair timeseries and data arrays together. Data is only coupled if
% the number of rows in the timeseries is exactly the same as the
% number of rows in the data array.
timesizes  = vertcat(speedvars(:).size);  % Concatenate timeseries sizes
speedsizes = vertcat(timevars(:).size);  % Concatenate speed array sizes

% Find intersection and their locations in the structures returned by whos
% By using intersect we only get the data that is matched
[sizes, timeidx, speedidx] = intersect(timesizes(:,1), speedsizes(:,1));

% Preallocate structure
ndata = length(sizes);
groupeddata(ndata).time = [];
groupeddata(ndata).speed = [];

% Unavoidable (without saving/loading data) eval loop :|
for ii = 1:ndata
    groupeddata(ii).time  = eval('timevars(timeidx(ii)).name');
    groupeddata(ii).speed = eval('speedvars(speedidx(ii)).name');
end
非评估方法,根据请求:

ENGSPD_1       = rand(10, 1);
Eng_Spd        = rand(20, 1);
Speed          = rand(30, 1);
TIME           = rand(30, 1);
Time           = rand(20, 1);
engine_speed_2 = rand(5, 1);
time_1         = rand(10, 1);
time_2         = rand(5, 1);

save('tmp.mat')
oldworkspace = load('tmp.mat');
varnames = fieldnames(oldworkspace);

timevars = regexpi(varnames, '.*time.*', 'match', 'once');
timevars(cellfun('isempty', timevars)) = [];
speedvars = regexpi(varnames, '.*spe{0,2}d.*', 'match', 'once');
speedvars(cellfun('isempty', speedvars)) = [];

timesizes = zeros(length(timevars), 2);
for ii = 1:length(timevars)
    timesizes(ii, :) = size(oldworkspace.(timevars{ii}));
end
speedsizes = zeros(length(speedvars), 2);
for ii = 1:length(speedvars)
    speedsizes(ii, :) = size(oldworkspace.(speedvars{ii}));
end

[sizes, timeidx, speedidx] = intersect(timesizes(:,1), speedsizes(:,1));

ndata = length(sizes);
groupeddata(ndata).time = [];
groupeddata(ndata).speed = [];

for ii = 1:ndata
    groupeddata(ii).time  = oldworkspace.(timevars{timeidx(ii)});
    groupeddata(ii).speed = oldworkspace.(speedvars{speedidx(ii)});
end

有关计时,请参阅。

将动态命名的变量放入结构中,并使用该结构的字段。哦,等等,我已经为你之前的问题给出了答案……与其继续拼凑脆弱的hackey代码来尝试让这个实现工作起来,我强烈建议你接受前面给出的建议,停止尝试沿着这条路走下去。从一开始就开始,用一种健壮的方法编写代码,这种方法不需要所有这些废话,充其量只会在您更改数据时中断。这很可能会导致返回错误数据。@excaza漂亮的解决方案。非常感谢您的指导。您的解释是完整的,特别是非评估解决方案是有趣的!