如何在MATLAB中使用两个计数器保存for循环中每个循环的结果

时间:2013-07-09 09:51:03

标签: matlab loops for-loop

我的代码是这样的:

a=logical ([1]);

  b=logical (      [ 1     1     0
                     1     1     1
                     0     1     1]);

  c=logical (      [ 1     0     0     0
                     0     1     1     0
                     0     1     1     1
                     0     0     1     1]);

  d=logical (      [ 1     1     1
                     1     1     1
                     1     1     1]);
  E={   a
        b
        c
        d};

   for i= 1:numel(E)
    for j=1:numel(E{i}(:,1))
     a=numel(find(E{i}(j,:)))<2
      end
   end

如果E的每一行中的数字“1”小于2,我使用For循环检出。  我的问题是:对于for循环,我总是收到结果“a”作为最后一个循环的结果。像这样:

a =

         1


    a =

         0


    a =

         0


    a =

         0


    a =

         1


    a =

         0


    a =

         0


    a =

         0


    a =

         0


    a =

         0


    a =

         0

但是我想在向量中保存每个循环中的“a”值(这里11行表示11个循环)。像这样:

a = [1
       0
       0
       0
       1
       0
       0
       0
       0
       0
       0]

或者显然,我想对E:

执行这些步骤

1.如果E的单元格只包含一个元素(1 x 1)(此处为E(1)),则不执行任何操作

2.Else,检查一下,如果E中每个单元格的每一行中数字“1”的数字小于2

所以最后我得到了这样的结果:

 a = [   0
         0
         0
         0
         1
         0
         0
         0
         0
         0
         0]

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如何跳过循环并执行

C = cellfun(@(x) sum(x,2)<2, E, 'UniformOutput', false);
a = cat(1, C{:})

运行Dan的循环,我的cellfun为您提供的E,1000次,结果

Elapsed time is 0.113762 seconds.  % loop, and 
Elapsed time is 0.234935 seconds.  % cellfun on small E

上运行两个解决方案1000次
E = repmat(E, 1e2,1);

给出

Elapsed time is 9.740406 seconds. % loop, and
Elapsed time is 2.538942 seconds. % cellfun on Large E

没有预先分配a

Elapsed time is 8.301579 seconds. % loop, and
Elapsed time is 2.538762 seconds. % cellfun on Large E

预先分配a

所以,如果你必须经常这样做:

  • 如果您的数据集总是很小,请使用循环
  • 如果您的数据集总是很大,请使用cellfun

如果你不得不这样做几次;

答案 1 :(得分:0)

怎么样:

   for i= 1:numel(E)
     for j=1:numel(E{i}(:,1))
       a(i, j) = numel(find(E{i}(j,:)))<2
     end
   end