我正在使用project euler problem并且它要求我对名称的文本文件进行排序,然后根据其字母位置为名称中的每个字母分配一个值(即'Bob'= 2,15 ,2)。
我正在考虑使用excel中的VLOOKUP函数来解决问题。我想用字母顺序创建一个带字母表中字母的参考列向量 - 每个字母在参考向量中的位置是它的“值”。然后我可以在我的名字表中输入一个条目,说“BOB”,并在参考向量中查找值B,O和B,输出它们的位置,从而输出每个字母的值。
我的问题:如何将一个矩阵中的值引用到另一个向量中的值?感谢您对这个人的帮助。
答案 0 :(得分: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
现在,使用上面的char-to-number转换:
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'
答案 1 :(得分: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在他们的帖子中详细说明了这一点。你可以很容易地适应它。