1

ベクトル n 値があり、リング トポロジがあると見なされる場合は、3 つの隣接する値のグループ n グループに分割したいと考えています。

私がやろうとしていることはこれです:

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 として問題になります。

私はかなりハックっぽい解決策を考え出しました:

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 ベースのインデックス作成方法は非常にイライラする場合があります...
ただし、0 ベースのインデックスに 1 を追加するだけで済みます。

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 ループをベクトル化する 1 つの方法を次に示します。

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

詳細については、mathworks の Web サイトを参照mat2cellしてください。より多くの例と情報については、SO でについて読むこともできます。


PS、Matlab で変数名として使用しないこと
をお勧めします。i

于 2014-09-04T05:32:12.940 に答える