2011-07-29 25 views
0

我需要將2個矩陣中的列轉換爲same datatype,以便我可以運行ismember。一列是矩陣[]格式,另一列是字符串格式,即我們需要匹配[2000]'2000'。請參閱:MATLAB中的cell2mat轉換(對於ismember)

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';} ; 

如果可能,應該欣賞向量化代碼。

回答

1

如果你知道所有的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

根據我的理解,您想合併基於第二列的兩組中的行。下面是我的實現:

%# 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'