【问题标题】:How do I apply an index to many differing variables at once?如何一次将索引应用于许多不同的变量?
【发布时间】:2015-05-22 14:49:08
【问题描述】:

我有几个不同数据类型的向量,大小都相同。具体来说,我将日期时间用作双打、字符串等的日期戳。我希望快速轻松地删除所有周末,因此我从日期时间创建和索引。我现在如何将此索引应用于我的所有变量?

目前我有(对于一小部分),

Date=Date(idx);
Meter=Meter(idx); 
Model=Model(idx);
.
.
.

是否有一些现有的功能,例如,像,

[Date,Meter,Model,...]=fnc(idx,Date,Meter,Model,...);

我一直很想自己写,应该很容易,但如果有其他简单或有效的替代方案,我就不想写了。

【问题讨论】:

    标签: matlab indexing


    【解决方案1】:

    @Luis Mendo 指出,使用单元乐趣的另一种方法是使用 structfun - 这样您就可以为每个数组保留变量名称。

    您需要在结构中包含所有变量才能使其工作:

    myStruct.Date  = Data;
    myStruct.Meter = Meter;
    myStruct.Model = Model;
    subStruct = structfun ( @(x) x(idx), myStruct, 'UniformOutput', false )
    

    【讨论】:

    • 保留变量名的好主意!
    • 这里的问题是写出Date=Date(idx); 所花费的时间,所以这并不能完全解决这部分问题。有没有其他方法可以将变量分配给mystruct
    • @josh 见cell2struct。但是你仍然需要显式地编写变量名
    【解决方案2】:

    你可以这样:

    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。我不太习惯使用细胞,所以我有点不愿意使用它。它们显然很强大,所以我想这是开始的一个很好的理由。
    • 拥有单独变量的问题在于,如果您有很多变量,它们很难处理,例如当您想对所有变量应用相同的操作时。当然,如果你有三个或四个变量,那不是问题。
    • 如果您发现cellfun 令人困惑(我一开始也是这样做的)您可以使用简单的for 循环来遍历元胞数组
    • 很好,但是这里不需要使用deal,对吧?
    • @josh 在这种情况下,最简单的方法是为每个变量单独执行:Date(idx) = value;; Meter(idx) = value; 等。如果这是个问题,您可能不应该使用单独的变量,而是使用元胞数组或结构数组
    【解决方案3】:

    您可以像这样将该函数定义为匿名函数:

    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'
    

    【讨论】:

    • 非常好。类似于@Luis Mendo,但为输出分配了变量名。
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多