2

for ループを使用せずにこの Matlab コードを実装するにはどうすればよいですか?

b=10:10:50
a=50*rand(1,50);

for ii=2:numel(b)
    ind{ii}=find(a<b(ii) & a>b(ii-1));
end
4

2 に答える 2

3

ヒストグラムを作成し、どの要素がどのビンに収まるかを追跡しているようです。これは、次の行で「ほぼ」必要なものを取得できることを意味します。

a = 50 * rand(1, 50);
b = 10:10:50;
[h c] = histc(a, b);

ここで、cにはaの各要素の「ビン」のインデックスが含まれています。たとえば、

a = [15 22 9 7 25];

それで

c = [1 2 0 0 2];

これらをセル配列に収集することの価値がわからない-の値で何をしたいのかは、で実行indできるように思えますc

「ベクトル」演算(同じ長さのものを意味する)でセル配列(おそらく異なる長さ)を作成するのは難しいかもしれません...誰かが反例を作成するのを見たいと思います!

編集:私は自分の反例を発見しました...次の行は、indコードと同じようにセル配列を生成します(arrayfunコマンドには暗黙のforループがありますが、「ベクトル化」されていると見なされます)。

ind = arrayfun(@(x)find(x==c),1:numel(b)-1, 'uniformoutput', false);

これが行われると、セル配列indにはセル以降の値が含まれind{1}、元のコードはセルからインデックス付けされることに注意してくださいind{2}。それが問題であるなら、私はあなたがそれを修正できると確信しています...

0また、コードはとの間で乱数を生成して50いますが、「有効なビン」はとの間だけで10あることに注意してください50(アルゴリズムの記述方法のため)。したがって、収集されるインデックスの合計は50より少し少なくなります(平均で40)。

于 2013-03-08T22:37:11.593 に答える
2

以下のスクリプトは同じことを行います。マトリックスには、ループによって newInd割り当てられて出力されるのと同じ値が含まれます。ind

b=10:10:50;
a=sort(randi(50,1,10));

% create shifted version of vector b to account
% for comparison between i and i-1
newB1 = b(1:end-1);
newB2 = b(2:end);

% create tiled version of a and b
newB1 = repmat(newB1',1,numel(a));
newB2 = repmat(newB2',1,numel(a));
newA = repmat(a,numel(b)-1,1);

%find linear indices that meet required conditions
LinearInd = find(newA<newB2 & newA>newB1);
%convert linear indices to subscripts
[i,newInd] = ind2sub(size(newA),LinearInd);
% display indices that correspond to ind
newInd
于 2013-03-08T21:41:45.940 に答える