2

ネストされた for ループをコードから削除したいですか? それらを削除することはできません。

k = 3;    
Data = rand(100,5);    
m = zeros(size(Data));    
N = size(Data,2); % number of features
M = size(Data,1); % number of objects
bound = zeros(N,k+1);

MAX = max(Data);
MIN = min(Data);


for ii = 1:N
    bound(ii,:) = linspace(MIN(ii), MAX(ii), k+1);
end

bound(:,end) = bound(:,end)+eps;

tic;
for ii = 1:M
    for jj=1:N
        for kk=1:k
            if bound(jj,kk)<=Data(ii,jj) && Data(ii,jj)<bound(jj,kk+1)
                m(ii,jj) = kk;
            end
        end
    end
end
4

3 に答える 3

0

最長のループが終わったのでii=1:M、これをベクトル化することを優先する必要があります。最小のループは終わったkk=1:kので、これはおそらくあまり気にせずにとどまることができます。bsxfunこの種のベクトル化で大きな効果を得るために使用できます。

for kk = 1:k
    ind = bsxfun(@le, bound(:, kk)', Data) & bsxfun(@gt, bound(:, kk+1)', Data);
    m(ind) = kk;
end

これにより、上記のコードと同じ結果が得られます。

于 2013-04-20T13:27:51.153 に答える
0

もう 1 つの選択肢はhistc()、ビニング用に特別に設計された です。

for jj = 1:N
   [~, m(:,jj)] =  histc(Data(:,jj),bound(jj,:));
end

このソリューションは と同等ですがbsxfun()、あまり意味のある比較ではありません。なぜなら、ここではループが列をまたがっているのに対し、bsxfun は境界をまたいでいるからです。したがって、経験則として、histc()境界よりも列が少ない場合は使用し、それ以外の場合はbsxfun().

于 2013-04-20T17:38:38.857 に答える