【问题标题】:Running if condition and while loop independantly for each cell of a cell array without for loop为单元数组的每个单元独立运行 if 条件和 while 循环,无需 for 循环
【发布时间】:2014-05-21 14:01:21
【问题描述】:

我有一个名为 x 的 1x10(说 10,因为它实际上是 262144,但就我的问题而言,10 就足够了)单元阵列。每个单元格是一个由 0 到 4 个实数值组成的数组。

我想根据每个单元格中的元素数量运行一个 if 条件,而不使用 for 循环(正如我所说,它实际上是 262144 个单元格长,所以 for 循环可能有点重)。

for 循环示例显示我想要做什么:

for i = 1:10
    if numel(x{i}) > 2
        h(i) = 0;
    else
        h(i) = 1;
    end
end

然后我想在每个单元格上独立运行一个 while 循环,将 h 递增 1 直到它达到单元格长度的值。

len = cellfun(@numel,x)
while h < len
    h = h+1;
    %code that does thing on each cell still in the while loop
end

我从没在网上看到过类似的东西,尽管我已经看得很透彻了。如果有人能给我一个关于如何在不使用 for 循环(这是我的问题的核心)的情况下在单独的单元格上独立工作的全局指示,我会很棒!

编辑:知道如何对所有单元格的值 X 进行操作也很棒。例如:

k = x{:}(1) < x{:}(2)

这不起作用,但我不知道为什么,我也不知道会怎样。尝试将所有第一个值与所有第二个值进行比较。

【问题讨论】:

  • 查看我的更新答案以解决您的编辑问题。

标签: matlab cell


【解决方案1】:

对于您的第一个问题,您可以轻松地使用cellfunlogical indexing 的组合来生成h

h = cellfun(@numel, x) <= 2;

如果值小于或等于 2,&lt;= 2 位将返回 1,否则返回 0。

注意forwhile 循环really aren't slow,所以也许你写的是“足够好”。

编辑:关于您新的、已编辑的问题:除非您可以保证每个单元格内的每个数组的长度相同,否则这是无法做到的。我会假设是的。

如果是这样,你可以简单地调用cell2mat将元胞数组转换为矩阵,然后直接比较两列:

A = cell2mat(x);
k = A(:,1) < A(:,2);

如果长度都不同,您可以用零或nan 填充它们以使它们具有相同的长度。

【讨论】:

  • 至于第二位,你的 while 循环不会像写的那样工作,因为 h &lt; len 将评估为一个逻辑数组,但 while 需要一个逻辑标量。
  • 我会在for循环中尝试一下,然后给你反馈!
  • 嗯,for 循环每 250 个单元大约需要 1 秒,所以......可能还不够“好”。
  • 每 250 个单元格 1 秒听起来很慢。您必须做的不是您所展示的代码,而是要花费所有时间。与其猜测什么可能有助于加快您的代码速度,不如考虑发布一个更具代表性的代码示例,并寻求帮助以加快速度。
  • 考虑使用MATLAB Profiler 来查找可以加速您的代码的位置。如果瓶颈实际上在于您正在执行的各个操作的逻辑中,那么加速循环将无济于事。
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2019-04-19
  • 2014-07-11
  • 2014-08-21
  • 2019-10-03
  • 1970-01-01
  • 2012-10-20
  • 2021-01-15
相关资源
最近更新 更多