如何用Matlab中的另一个不同大小的数组的相应值替换表列的某些元素?

And*_*kiy 4 arrays matlab replace vectorization

我有一个分类表变量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' ....
Run Code Online (Sandbox Code Playgroud)

我有一个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'
.....
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法来不使用循环?

Lui*_*ndo 5

这个怎么样?

[v, w] = ismember(alloptions, Expiration_Table(:,1));
result = Expiration_Table(w(v),2);
Run Code Online (Sandbox Code Playgroud)

在你的例子中,用

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'}
Run Code Online (Sandbox Code Playgroud)

结果是

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'
Run Code Online (Sandbox Code Playgroud)

如果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);
Run Code Online (Sandbox Code Playgroud)

这使

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'
    ''
    ''
    ''
Run Code Online (Sandbox Code Playgroud)