2017-01-06 6 views
0

У меня есть 2D matrix, содержащий только целые числа. У меня также есть массив ячеек tickerList, который содержит имена титров акций. Число столбцов в matrix равно числу элементов в tickerList.Заполнение массива ячеек с помощью таблицы поиска

Я пытаюсь создать cellArrayNew, заменив целые числа в пределах matrix соответствующими именами в tickerList. Так, например, если matrix(1,1)=3 и tickerList(3)='S&P 500', я хотел бы иметь cellArrayNew(1,1)='S&P 500'.

ответ

1

Просто используйте матрицу в качестве индекса в tickerList:

% Sample column names 
tickerList = {'Col1' 'Col2' 'Col3'}; 

% Example matrix 
N = numel(tickerList); 
matrix = randi(N, [4, N]); 

% The matrix is already in index form, so just index: 
cellArrayNew = tickerList(matrix); 

Если матрица содержит индексы, которые каким-то образом не в tickerList, используйте ismember:

% Make some elements 'NaN'; 
matrix(rand(size(matrix)) < 0.2) = NaN; 

% Determine which elements are in tickerList, 
% as well as where they are precisely 
[isin, I] = ismember(matrix, 1:N); 

% Construct new matrix 
cellArrayNew = repmat({NaN}, size(matrix)); % <- use any filler you want 
cellArrayNew(isin) = tickerList(I(isin)) 

Результат моего примера:

cellArrayNew = 
    'Col2' 'Col1' [ NaN] 
    'Col3' [ NaN] 'Col2' 
    'Col3' 'Col3' 'Col3' 
    'Col3' 'Col1' 'Col2' 
+0

Почему вы используете 'ismember'. Из вашего решения я только что узнал, что 'I' равен' matrix'. Итак, очень простое решение кажется 'cellArrayNew = tickerList (matrix)' Я что-то упустил? – Andi

+0

@ Andi ... очень правдивый. Должно быть, там спали :) –

+0

@ Аnd просто помните о будущем, а '' ismember' позволяет сделать то же самое для матриц, которые * могут * иметь элементы, которые превышают длину 'tickerList' (ситуация I как правило, сталкиваются, что, вероятно, потому, что моя память мышления пнула во время ввода этого ответа?) –

Смежные вопросы