-2

我有这样的代码:

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

我使用 For 循环检查,如果 E 的每一行中的数字“1”小于 2。我的问题是:使用 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.否则,检查一下,如果E中每个单元格的每一行中的数字“1”的个数小于2

所以最后我有这样的结果:

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

提前感谢您的帮助!

4

2 回答 2

1

如何跳过循环并做

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

运行 Dan's loop 和 my cellfunfor the Eyou give 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.

如果您只需要这样做几次;

于 2013-07-09T11:34:02.073 回答
0

怎么样:

   for i= 1:numel(E)
     for j=1:numel(E{i}(:,1))
       a(i, j) = numel(find(E{i}(j,:)))<2
     end
   end
于 2013-07-09T10:50:04.717 回答