2012-07-03 73 views
0

我正在工作project euler problem,它要求我排序名称的文本文件,然后根据字母的位置为名称中的每个字母赋值(即'Bob'= 2,15 ,2)。参考表:MATLAB

我想在Excel中使用类似VLOOKUP函数的问题来解决问题。我想用字母顺序创建一个带有字母顺序的参考列向量 - 每个字母在参考向量中的位置就是它的“值”。然后我可以在我的名字表中输入一个条目,比如说“BOB”,然后在参考向量中查找值B,O和B,输出它们的位置,从而输出每个字母的值。

我的问题:你如何将一个矩阵中的值引用到另一个向量中的值?感谢您对这个每个人的帮助。

+0

@iCodez:哦!我想知道为什么所有这些项目欧拉问题不断涌现! – knedlsepp

+0

@knedlsepp - 是的,对于轰炸'活跃'页面感到抱歉。 :)我们目前正在烧录标签。它应该在一小时内销毁。 – iCodez

回答

1

除非性能在这里真正关心,否则我不会为查找表而烦恼。有一种简单的方法可以将您的角色转换为数字。

取每个字符串,它们使用upper上的情况下,减去关“A”,并添加一个到所有转换“A的成” 1',“B的为” 2的等

s = 'Bob'; 
num_s = upper(s) - 'A' + 1; 

对于我自己的发展,我仍然很好奇,可以学习如何检查一个角色,将它匹配到另一个向量中的条目并记住它所对应的值。 - user1499689

在Matlab中做到这一点很简单。比方说,你有26个元素的查找表,lookup

lookup = zeros(26,1); 
% define the lookup table 
for i=1:numel(lookup) 
    lookup(i) = 2*i - 7; % some random function 
end 

现在,使用上面的字符到数字的转换:

s = 

Joe 

>> lookup(upper(s) - 'A' + 1) 

ans = 

    13 
    23 
    3 

这里的关键是,MATLAB允许你索引的矩阵与另一个矩阵:M(A)。矩阵A的元素被视为矩阵M中的索引。您的字符串s是一个char矩阵,您可以通过减去'A'将其转换为数字矩阵。行lookup(...)然后使用该转换矩阵的元素来索引矩阵lookup

顺便说一句,这也可以用于分配。例如,如果你想保持(独立的情况下),每一个字符计数:

% Initialize counts to zero somewhere at the beginning 
counts = zeros(26,1); 

... % do your stuff 

% let 's' be an alphabetic word (only A-Z and a-z) 
s_inds = upper(s) - 'A' + 1; 
counts(s_inds) = counts(s_inds) + 1; % increment the counts of all characters in 's' 
+0

+1不需要显式演员:'num = upper(s) - 'A'+ 1' – Amro

+0

这真棒帮助 - 绝对是一个更好的解决方案。感谢大家。对于我自己的发展,我仍然很好奇,可以学习如何检查一个角色,将它与另一个向量中的条目相匹配,并记住它所对应的值。 – user1499689

+0

太棒了。谢谢Stewman。 – user1499689

0

你需要产生各种各样的查找表的方法。我们将以您在这里的一般示例为例。字母表中有26个字母,不区分大小写。

Basic_lookup = 1:26; % Note: this can be changed up if you want some level of randomness. 
% Basic_lookup = randperm(26); % I like this a bit better for randomness sake. And is just an example of making it random. 

现在,这是去从1到26,所有你需要做的仅仅是经过你的价值具有价值,并叫你从查找表所需要的值的字符串中的一个行向量。 @sfstewman在他们的文章中详细说明了这一点。你可以很容易地从中适应。

+0

此外,只是一个笔记...如果你想考虑的情况下,你需要适应上述代码,以适应大小写。 –