如何一次将索引应用于多个不同的变量?
How do I apply an index to many differing variables at once?
我有几个不同数据类型的向量,它们的大小都相同。具体来说,我将日期时间作为双打、字符串等的日期戳。我希望快速轻松地删除所有周末,因此我从日期时间创建和索引。我现在如何将此索引应用于我的所有变量?
目前我有(一小部分),
Date=Date(idx);
Meter=Meter(idx);
Model=Model(idx);
.
.
.
有没有现成的功能,比如,
[Date,Meter,Model,...]=fnc(idx,Date,Meter,Model,...);
我很想自己写一个,应该很容易,但如果有其他简单或有效的替代方法,我不想这样做。
你可以这样做:
t = cellfun(@(x) x(idx), {Date, Meter, Model}, 'uniformoutput', 0);
[Date, Meter, Model] = deal(t{:});
在最新版本的 Matlab 中,您可以 omit deal
,因此第二行变为:
[Date, Meter, Model] = t{:};
如果您有一个元胞数组而不是单独的变量,这样会更容易,这样每个元胞都包含您的一个变量。在那种情况下,您只需使用
myCell = cellfun(@(x) x(idx), myCell, 'uniformoutput', 0);
正如 @Luis Mendo 所指出的,使用 cell fun 的替代方法是使用 structfun
- 这样你就可以为每个数组保留变量名。
您需要在一个结构中包含所有变量才能工作:
myStruct.Date = Data;
myStruct.Meter = Meter;
myStruct.Model = Model;
subStruct = structfun ( @(x) x(idx), myStruct, 'UniformOutput', false )
您可以像这样将该函数定义为匿名函数:
f=@(idx, varargin) subsref(cellfun(@(x) x(idx), varargin, 'uni', 0), substruct('{}', {':'}));
现在
>> A=rand(1,3)
A =
0.9649 0.1576 0.9706
>> B={'a' 'b' 'c'}
B =
'a' 'b' 'c'
>> [x,y]=f(2,A,B)
x =
0.1576
y =
'b'
我有几个不同数据类型的向量,它们的大小都相同。具体来说,我将日期时间作为双打、字符串等的日期戳。我希望快速轻松地删除所有周末,因此我从日期时间创建和索引。我现在如何将此索引应用于我的所有变量?
目前我有(一小部分),
Date=Date(idx);
Meter=Meter(idx);
Model=Model(idx);
.
.
.
有没有现成的功能,比如,
[Date,Meter,Model,...]=fnc(idx,Date,Meter,Model,...);
我很想自己写一个,应该很容易,但如果有其他简单或有效的替代方法,我不想这样做。
你可以这样做:
t = cellfun(@(x) x(idx), {Date, Meter, Model}, 'uniformoutput', 0);
[Date, Meter, Model] = deal(t{:});
在最新版本的 Matlab 中,您可以 omit deal
,因此第二行变为:
[Date, Meter, Model] = t{:};
如果您有一个元胞数组而不是单独的变量,这样会更容易,这样每个元胞都包含您的一个变量。在那种情况下,您只需使用
myCell = cellfun(@(x) x(idx), myCell, 'uniformoutput', 0);
正如 @Luis Mendo 所指出的,使用 cell fun 的替代方法是使用 structfun
- 这样你就可以为每个数组保留变量名。
您需要在一个结构中包含所有变量才能工作:
myStruct.Date = Data;
myStruct.Meter = Meter;
myStruct.Model = Model;
subStruct = structfun ( @(x) x(idx), myStruct, 'UniformOutput', false )
您可以像这样将该函数定义为匿名函数:
f=@(idx, varargin) subsref(cellfun(@(x) x(idx), varargin, 'uni', 0), substruct('{}', {':'}));
现在
>> A=rand(1,3)
A =
0.9649 0.1576 0.9706
>> B={'a' 'b' 'c'}
B =
'a' 'b' 'c'
>> [x,y]=f(2,A,B)
x =
0.1576
y =
'b'