1

我有一个向量 n 值,如果它被认为具有环形拓扑,我想将它分成 n 组,每组 3 个相邻值。

我想做的是:

vector = [some values];
groups = {};

for i = 1:size(vector)(2)
    groups{i} = [vector(mod(i-1, size(vector)(2));
                 vector(i);
                 vector(mod(i+1, size(vector)(2))];
endfor

所以如果 n = 10 和 i = 1,组应该是 [vector(10); 向量(1);向量(2)]

在大多数编程语言中,只使用 mod 运算符会非常简单,但是我无法使用 matlab 来解决这个问题,因为它不使用 0 作为向量的初始索引,所以如果 i = 1,那么 mod (i-1) = 0,这是一个非法的索引值。i = n 也是一个问题,因为 mod(n, n) = 0。

我在以下方面制定了一个非常hack-ish的解决方案:

vector = [some values];
groups = {};

for i = 1:size(vector)(2)
    if i == 1
        groups{i} = [vector(size(vector)(2));
                     vector(1);
                     vector(2)];
    elseif i == size(vector)(2)
        groups{i} = [vector(size(vector)(2)-1);
                     vector(size(vector)(2);
                     vector(1)];
    else
        groups{i} = [vector(i-1);
                     vector(i);
                     vector(i+1)];
    endif
endfor

但这很不雅,我觉得应该有更好的方法来做到这一点..

是否有一些运算符允许您对向量索引执行模运算?

4

1 回答 1

3

确实,matlab 的基于 1 的索引方法有时会很烦人……不过,
您可以简单地将 1 添加到基于 0 的索引中

n = numel(vector);
for ii = 1:n
    idx0 = mod( ii + [-2, 1, 0], n ); % 0-based indices
    group{ii} = vector( idx0 + 1 );
end

现在,良好的 Matlab 实践是关于的,这是向量化这个 for 循环的一种方法

idx0 = mod( bsxfun( @plus, 1:n, [-2;1;0] ), n ); % all indices at once
group = mat2cell( vector( idx0+1 ).', ones(n,1), 3 );

您可以mat2cell在 mathworks 网站中查找更多信息。您还可以在 SO 上阅读关于的更多示例和信息。


PS,
最好不要i在 Matlab 中用作变量名

于 2014-09-04T05:32:12.940 回答