在单元格中有效迭代

时间:2014-06-17 09:04:54

标签: matlab iteration cell

如何在单元格中高效迭代?

我有一个这样的细胞:

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

这是在单个单元格上的两层(原谅我的英语)迭代。

此代码效率不高。

enter image description here

在迭代中浪费了太多时间。

我正在尝试找到一种有效的方法来执行此迭代。

一种可能的解决方案是使用cellfun(@COMPLEX_OPERATION),但我不确定如何使用cellfun执行此双循环。

另一种可能的解决方案是首先修剪空单元格。但是我不确定这是否会在很大程度上解决这个问题。

2 个答案:

答案 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值,并将其按元素方式应用于HHrc将用作匿名函数的输入,您可以将其用作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]);