我有一个 分类 表变量 alloptions.Exp(96399 行),其值如下:

'Mar1 15'
'Mar1 15'
'Mar1 15'
'Mar1 15'
'Mar 15'
'Mar 15'
'Mar 15'
'Apr1 15'
'Apr2 15'
'Apr 15'
'Apr4 15'
'May1 15'
'May2 15'
'May 15'
'May4 15' ....

我有一个具有以下值的 119x2 Expiration_Table 数组:
'Mar1 15'   '06-Mar-2015'
'Mar2 15'   '13-Mar-2015'
'Mar 15'    '20-Mar-2015'
'Mar5 15'   '31-Mar-2015'
'Apr1 15'   '02-Apr-2015'
'Apr2 15'   '10-Apr-2015'
'Apr 15'    '17-Apr-2015'
'Apr4 15'   '24-Apr-2015'
'May1 15'   '01-May-2015'
.....

我需要的是创建另一个表变量 alloptions.ExpDate 具有来自 Expiration_Table(:,2) 的相应值,即来自第二列。

不使用循环有没有更好的方法来做到这一点?

最佳答案

这个怎么样?

[v, w] = ismember(alloptions, Expiration_Table(:,1));
result = Expiration_Table(w(v),2);

在你的例子中,与
alloptions = {'Mar1 15'
              'Mar1 15'
              'Mar1 15'
              'Mar1 15'
              'Mar 15'
              'Mar 15'
              'Mar 15'
              'Apr1 15'
              'Apr2 15'
              'Apr 15'
              'Apr4 15'
              'May1 15'
              'May2 15'
              'May 15'
              'May4 15'};
Expiration_Table = {'Mar1 15'   '06-Mar-2015'
                    'Mar2 15'   '13-Mar-2015'
                    'Mar 15'    '20-Mar-2015'
                    'Mar5 15'   '31-Mar-2015'
                    'Apr1 15'   '02-Apr-2015'
                    'Apr2 15'   '10-Apr-2015'
                    'Apr 15'    '17-Apr-2015'
                    'Apr4 15'   '24-Apr-2015'
                    'May1 15'   '01-May-2015'}

结果是
result =
    '06-Mar-2015'
    '06-Mar-2015'
    '06-Mar-2015'
    '06-Mar-2015'
    '20-Mar-2015'
    '20-Mar-2015'
    '20-Mar-2015'
    '02-Apr-2015'
    '10-Apr-2015'
    '17-Apr-2015'
    '24-Apr-2015'
    '01-May-2015'

如果 alloptions 分类 ,这也有效,例如在上述定义之后运行 alloptions = nominal(alloptions);

注意
  • 如果 alloptions 中的值与 Expiration_Table 中的几行匹配,则选择 第一个
  • alloptions 中没有匹配行的 Expiration_Table 值是 忽略的 。如果您希望将它们设置为 预定义值,例如 作为空字符串,请使用以下修改后的代码:

  • 修改代码以将未找到的值设置为预定义值:
    [v, w] = ismember(alloptions, Expiration_Table(:,1));
    result = repmat({''}, numel(alloptions), 1); %// initiallize to predefined value
    result(v) = Expiration_Table(w(v),2);
    

    这使
    result =
        '06-Mar-2015'
        '06-Mar-2015'
        '06-Mar-2015'
        '06-Mar-2015'
        '20-Mar-2015'
        '20-Mar-2015'
        '20-Mar-2015'
        '02-Apr-2015'
        '10-Apr-2015'
        '17-Apr-2015'
        '24-Apr-2015'
        '01-May-2015'
        ''
        ''
        ''
    

    关于arrays - 如何在Matlab中用另一个不同大小的数组的对应值替换表列的某些元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33645431/

    10-10 09:38