преобразование cell2mat в MATLAB (для ismember) - PullRequest
0 голосов
/ 30 июля 2011

Мне нужно преобразовать столбец в 2 матрицах в same datatype, чтобы я мог запустить ismember.Один столбец в матричном [] формате, а другой - в строковом формате, т.е. нам нужно сопоставить [2000] с '2000'.Пожалуйста, смотрите:

    mat1 = {'aa' [2001] ; 'ex' [10] ; 'ex' [1001]  ; 'rt' [4001] ;} ;
    mat2 = {'abc' '10' ; 'def' '4001' ; 'ghi' '2001' ; } ;

ismember(cell2mat(mat1(:,2)), cell2mat(mat2(:,2))) % Gives ERROR

%cell2mat(mat1(:,2) works just fine
%cell2mat(mat2(:,2)) is the PROBLEM.  

%Final answer
    ans = {...
     'aa' [2001] 'ghi'; 'ex' [10] 'abc'; 'ex' [1001] 'abc'; 'rt' [4001] 'def';} ;

Буду признателен за векторизованный код, если это возможно.

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Если вы знаете, что весь второй столбец mat2 будет строками, вы можете преобразовать их в числа следующим образом:

mat2(:,2) = cellfun(@str2num, mat2(:,2), 'UniformOutput', false)

Итерация через будет также работать, особенно если вы не уверены, что они все строки:

for i=1:size(mat2,1)
    if ischar(mat2{i,2})
        mat2{i,2} = str2num(mat2{i,2});
    end
end
0 голосов
/ 30 июля 2011

Насколько я понимаю, вы хотите объединить строки из двух наборов на основе второго столбца.Вот моя реализация:

%# data
mat1 = {'aa' [2001] ; 'ex' [10] ; 'ex' [1001]  ; 'rt' [4001] ;} ;
mat2 = {'abc' '10' ; 'def' '4001' ; 'ghi' '2001' ; } ;

%# sorted row keys
[key1 ord1] = sort( cell2mat(mat1(:,2)) );
[key2 ord2] = sort( str2double(mat2(:,2)) );

%# match rows based on key
[idx1 loc1] = ismember(key1,key2);
[idx2 loc2] = ismember(key2,key1);

%# merge
merged = [mat1(ord1(loc2(idx2)),:) mat2(ord2(loc1(idx1)),1)];

Результат:

>> merged
merged = 
    'ex'    [  10]    'abc'
    'aa'    [2001]    'ghi'
    'rt'    [4001]    'def'
...