参考表:MATLAB

时间:2012-07-03 18:47:09

标签: matlab

我正在使用project euler problem并且它要求我对名称的文本文件进行排序,然后根据其字母位置为名称中的每个字母分配一个值(即'Bob'= 2,15 ,2)。

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

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

2 个答案:

答案 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在他们的帖子中详细说明了这一点。你可以很容易地适应它。