是否可以从我的代码中删除循环?
问题描述:
我想从我的代码中删除嵌套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
答
你可以避免嵌套达到一定的限制。
一目了然,为jj
指数似乎是在嵌套循环内的操作均匀,您可以通过简单
for ii = 1:M
for kk=1:k
m(ii,(bound(:,kk)<=Data(ii,:)' & Data(ii,:)'<bound(:,kk+1))) = kk;
end
end
更换
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
这将使你完全一样的结果如前。
答
由于你最长的循环结束了ii=1:M
,所以我们应该优先考虑这个问题。最小的循环超过kk=1:k
,所以这个人可能会留下来,不用担心太多。您可以在这种vectorisations使用bsxfun
有很大的影响:
for kk = 1:k
ind = bsxfun(@le, bound(:, kk)', Data) & bsxfun(@gt, bound(:, kk+1)', Data);
m(ind) = kk;
end
这给了相同的结果你上面的代码。
+0
非常感谢您的关注 – user1924748 2013-04-20 15:58:32
答
另一种方法是histc()
,这是专门为分级设计:
for jj = 1:N
[~, m(:,jj)] = histc(Data(:,jj),bound(jj,:));
end
该解决方案是与bsxfun()
相提并论,但因为这里的循环是跨列,而与bsxfun是跨边界它不是一个非常有意义的比较。因此,作为一个经验法则,如果我的列数少于边界,我会使用histc()
,否则bsxfun()
。
非常感谢您的关注 – user1924748 2013-04-20 16:38:27