2015-06-03 212 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