4

我在matlab中有以下字符串

V= 'abcdefghijklmnñopqrstuvwxyz';

然后我有一个 9 个字符的单词,由我的“V”字母表中的字符组成。

k = 'peligroso';

我想根据我的字母表用我的单词“k”的索引创建一个方阵(3x3),这将是输出。(请注意,我正在考虑的范围是 0 到 26,所以 'a' 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 'ñ' 必须在我的字母表中

4

3 回答 3

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
于 2012-08-21T07:48:00.490 回答
2

由于字符串只是字符数组,因此使用通常的数组处理函数很容易操作它们。

例如,我们可以使用 arrayfun 通过应用指定的函数来创建一个新数组,这会产生一个相同大小的输出数组。使用 reshape 我们可以形成所需的 3x3 形状。请注意,我们在最后进行转置,因为 MATLAB 的 reshape 以列优先顺序处理数组。

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'
于 2012-08-21T04:30:05.830 回答
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,但是

  1. 你必须测试这是否真的是真的,如果是真的,

  2. 你应该有足够复杂和足够大的案例来证明失去可读性ismember

请注意,Matlab 中的索引是从 1 开始的,这意味着V(1) = a. 上面的解决方案产生一个基于 1 的答案,而您提供一个基于 0 的示例。1如果您确实需要基于 0 的索引,只需从上面的行中减去。

于 2012-08-21T09:34:26.310 回答