2015-06-03 208 views
0
A = {'a','b','c','b','a',...} 

A<1X400>單元陣列和我想從創建矩陣A使得如果小區是a,矩陣顯示1,如果是b,它示出了如2中矩陣和3爲c單元陣列到矩陣

謝謝。

回答

2

這很簡單:

result = cell2mat(A)-'a'+1 

對於通用協會字母以數字1,2,3 ...:

letters2numbers = 'abc'; %// 'a'->1, 'b'->2 etc. 
[~, result] = ismember(cell2mat(A), letters2numbers) 

對於generic associati在字符串以數字1,2,3 ...的:

strings2numbers = {'hi', 'hello', 'hey', 'good morning', 'howdy'}; 
A = {'hello', 'hi', 'hello', 'howdy', 'bye'}; 
[~, result] = ismember(A, strings2numbers) 

在這個例子中,

result = 
    2  1  2  5  0 
+0

工作得非常好,但如果單元格包含「正確」之類的「單詞」會怎麼樣? –

+0

@ chinkare_16認爲你可以在這種情況下使用'unique' - '[〜,〜,out] = unique(A,'stable')'。但是,什麼映射到什麼,你需要做出決定。 – Divakar

4

具體案例

對於一個簡單的特殊情況下上市這個問題,你可以使用char將所有單元格元素轉換爲字符,然後從中減去96,這相當於'a'-1 -

A_numeric = char(A)-96 

採樣運行 -

>> A 
A = 
    'a' 'b' 'c' 'b' 'a' 
>> A_numeric = char(A)-96 
A_numeric = 
    1 
    2 
    3 
    2 
    1 

通用案例

對於非專利藥替代的情況下,你需要做更多的工作,像這樣 -

%// Inputs 
A = {'correct','boss','cat','boss','correct','cat'} 
newcellval = {'correct','cat','boss'} 
newnumval = [8,2,5] 

[unqcell,~,idx] = unique(A,'stable') 
[~,newcell_idx,unqcell_idx] = intersect(newcellval,unqcell,'stable') 
A_numeric = newnumval(changem(idx,newcell_idx,unqcell_idx)) 

樣品輸入 - 輸出 -

>> A,newcellval,newnumval 
A = 
    'correct' 'boss' 'cat' 'boss' 'correct' 'cat' 
newcellval = 
    'correct' 'cat' 'boss' 
newnumval = 
    8  2  5 
>> A_numeric 
A_numeric = 
    8  5  2  5  8  2 
1

使用for循環,其迭代A和轉換字符數

for loop = 1:length(A) 
    outMat(loop) = char(A(loop)) - 96 
end 

我希望它的作品。

+0

'for'循環是沒有必要的。這可以做矢量化。見Divakar的答案。 – rayryeng