我的代码是这样的:
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]
感谢您的帮助!
答案 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
。如果你不得不这样做几次;
cellfun
并且不必过于担心premature optimization:)答案 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