如何一次将索引应用于多个不同的变量?

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'