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
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
ヒストグラムを作成し、どの要素がどのビンに収まるかを追跡しているようです。これは、次の行で「ほぼ」必要なものを取得できることを意味します。
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)。
以下のスクリプトは同じことを行います。マトリックスには、ループによって 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