如何在单元格中高效迭代?
我有一个这样的细胞:
H{i,j} =
{1} {2} {3} {4} ...
{5} {6} {7} {8} ...
....
实际尺寸约为300 * 300,只有约1000个非空项目。
for i = 1 : numel(H)
if isempty(H{i}), continue, end
for j = 1 : numel(H)
if i==j || isempty(H{j}), continue, end
COMPLEX_OPERATION(H{i}, H{J});
end
end
end
这是在单个单元格上的两层(原谅我的英语)迭代。
此代码效率不高。
在迭代中浪费了太多时间。
我正在尝试找到一种有效的方法来执行此迭代。
一种可能的解决方案是使用cellfun(@COMPLEX_OPERATION),但我不确定如何使用cellfun执行此双循环。
另一种可能的解决方案是首先修剪空单元格。但是我不确定这是否会在很大程度上解决这个问题。
答案 0 :(得分:3)
这也应该很有趣。使用对cellfun的双重调用来获取所有组合。只需通过complex_function更改C1 + C2
%simulation
H=cell(300,300);
indx=randperm(numel(H));
[H{indx(1:1000)}]=deal(1);
%code you want
empty_H=cellfun(@isempty, H);
non_empty_H=H(~empty_H);
all_combinations=cellfun(@(C2) (cellfun(@(C1) C1+C2, non_empty_H, 'UniformOutput', false)), non_empty_H, 'UniformOutput', false);
答案 1 :(得分:1)
为什么你不能做
ind = ~cellfun(@isempty, H).* ~eye(size(H))
ind =
0 1
0 0
[r,c] = find(ind==1);
cellfun(@(H,r,c) (whatever_your_complex_function_does), H{[find(ind==1)].'}, cell2mat(r,[1 1]),cell2mat(c,[1 1]);
更长的解释......
H ={[],[1 2]; [] [3 4]}
ind = cellfun(@isempty, H)
ind =
1 0
1 0
那些是空指数。我们将在最后反转它们。
接下来,找到i=j
的位置。然后我们将在最后排除它们。
创建一个代表i=j
的标识矩阵。
I = eye(size(ind))
I =
1 0
0 1
然后将这些与ind相乘。我们使用~I
,以便我们得到i~=j
和(~ind)
,以便获得非空元素。
(~ind).*~I
ans =
0 1
0 0
现在,您已获得H
不为空且i~=j
的索引。
获取这些订阅。
[r,c] = find(ind==1);
然后创建一个匿名函数,该函数采用与这些下标对应的H
值,并将其按元素方式应用于H
。 H
,r
和c
将用作匿名函数的输入,您可以将其用作H{r}
或H{c}
cellfun(@(H,r,c) (whatever_your_complex_function_does), H{[find(ind==1)].'}, cell2mat(r,[1 1]),cell2mat(c,[1 1]);