我在matlab中有以下字符串
V= 'abcdefghijklmnñopqrstuvwxyz';
然后我有一个由9个字符组成的单词,由我的'V'字母表中的字符组成。
k = 'peligroso';
我想根据我的字母创建一个方形矩阵(3x3),其单词'k'的索引,这将是输出。 (注意我正在考虑的范围是0到26,所以'一个'char确实有索引0)
16 4 11 8 6 18 15 19 15
我这样做的代码是:
K = [findstr(V, k(1))-1 findstr(V, k(2))-1 findstr(V, k(3))-1;findstr(V, k(4))-1 findstr(V, k(5))-1 findstr(V, k(6))-1; findstr(V, k(7))-1 findstr(V, k(8))-1 findstr(V, k(9))-1];
但我认为必须有更优雅的解决方案来实现同样的想法吗?
PS:我没有使用ASCII值,因为char'ñ'必须在我的字母表中
答案 0 :(得分:7)
对于无循环解决方案,您可以使用ISMEMBER,它可以处理字符串以及数字:
K = zeros(3); %# create 3x3 array of zeros
[~,K(:)] = ismember(k,V); %# fill in indices
K = K'-1; %# make K conform to expected output
答案 1 :(得分:2)
由于字符串只是字符数组,因此使用常用的数组处理函数很容易操作它们。
例如,我们可以使用arrayfun通过应用指定的函数创建一个新数组,该函数生成相同大小的输出数组。使用重塑,我们可以形成所需的3x3形状。请注意,我们在最后进行转置,因为MATLAB的整形处理按列主要顺序排列数组。
K = reshape(arrayfun(@(x) findstr(V, x)-1, k), 3,3)'
或者,由于MATLAB允许您使用单个索引来索引矩阵,该索引以列主要顺序读取矩阵的条目,因此我们可以构造一个空矩阵并逐个构建其条目。
K = zeros(3,3)
for i=1:9
K(i) = findstr(V, k(i))-1;
end
K = K'
答案 2 :(得分:2)
我喜欢@Jonas的解决方案(ismember
),我认为这是最优雅的方式。
但是,只是为了提供另一种解决方案:
V = 'abcdefghijklmnñopqrstuvwxyz';
k = 'peligroso';
K = reshape( bsxfun(@eq, (k-0).', V-0) * (1:numel(V)).', 3,3).'
(原谅SO突出显示)
这样做的好处是,它只使用内置函数(ismember
不是内置的,至少不是我的Matlab R2010b)。这意味着此解决方案可能比ismember
快,但
你必须测试其实是真的,如果是的话,
你应该让案件复杂且足够大,以证明失去ismember
的可读性
请注意,Matlab中的索引是从1开始的,这意味着V(1) = a
。上面的解决方案产生一个基于1的答案,而您提供一个基于0的示例。如果你真的需要基于0的索引,只需从上面的行中减去1
。