сопоставление ячейки с матрицей / map / cellOperations (MATLAB) - PullRequest
2 голосов
/ 14 декабря 2010

Я не могу найти строковый эквивалент finalAnswer, используя данные ниже.Пожалуйста, я не могу использовать циклы if / for!Окончательный ответ предпочтителен с каждым элементом в виде массива (т.е. формат mainData)

mainData = {'IBM' [201] [1] ; 
            'GE' [403] [1] ; 
            'MSFT' [502] [3] ;
            'GM' [101] [2]       } ;

finalAns = [ 101 2 0.5; 403 1 0.6 ]                  ;

%% I tried doing this ->
temp = cell2mat(mainData(:,[2 3])) ;

tf = ismember(temp, finalAns(:,[1 2],'rows') ;
secIDs = mainData(tf) ;

1 Ответ

2 голосов
/ 14 декабря 2010

Чтобы получить записи в каждой строке mainData, совпадающие с записями в finalAns (на основе последних двух столбцов mainData и первых двух столбцов finalAns), и получить их в в том же порядке, в котором они отображаются в finalAns и добавлен последний столбец finalAns, вы можете сделать это:

>> temp = cell2mat(mainData(:,2:3));
>> [isThere,index] = ismember(finalAns(:,1:2),temp,'rows');
>> output = [mainData(index(isThere),:) num2cell(finalAns(isThere,3))]

output = 

    'GM'    [101]    [2]    [0.5000]
    'GE'    [403]    [1]    [0.6000]

Выходными данными является массив ячеек размером 2 на 4, каждое значение которого находится в отдельной ячейке. Если вы хотите, чтобы последние три столбца были собраны в векторе, вы можете заменить вычисление output выше следующим:

>> temp = [temp(index(isThere),:) finalAns(isThere,3)];
>> output = [mainData(index(isThere),1) num2cell(temp,2)]

output = 

    'GM'    [1x3 double]
    'GE'    [1x3 double]

Обратите внимание, что теперь у вас есть массив ячеек 2 на 2, где ячейки во втором столбце содержат двойные массивы 1 на 3.

...