【问题标题】:continue statment not executing correctly within for loop+matlabcontinue 语句在 for loop+matlab 中未正确执行
【发布时间】:2014-01-05 21:31:31
【问题描述】:

我有以下代码:

for i=1:length(files)
    for j=1:length(files(i,1).day)
        if ((1:length(files(i,1).day(j).hour)) ~=  24)
            continue
        end
        for h = 1:24
            if ((1:length(files(i,1).day(j).hour(h).halfhour)) ~= 2)
                continue
            end

            if isempty(1:length(files(i,1).day(j).hour))
                continue
            end
            dayPSD = [];
            for h2=1:2
                dayPSD = [dayPSD; files(i,1).day(j).hour(h).halfhour(h2).data{8}'];
            end
        end
    end
end

在哪里

  files=1x3 structure
  files(i,1).day=1x335 structure that contains 1 field hour which is a 1x24 structure
  files(i,1).day.hour=1x24 structure that contains 1 field halfhour which is a 1x2 structure

我正在尝试遍历 i 和 j,但是当 1:length(files(i,1).day(j).hour) ~= 24 时(所以当小时小于 24 时)我想退出循环并继续进行 for 循环的下一次迭代。如果 1:length(files(i,1).day(j).hour(h).halfhour) ~= 2 (所以当半小时小于 2) 或者如果 1:length(files(i,1).day(j).hour 是一个空单元格(无数据)。

我编写的当前代码似乎仅在 1:length(files(i,1).day(j).hour ~=24 时跳过循环索引。

我做错了什么?另外,如果满足任何这些条件,我如何让它继续进行下一次迭代?我一直在努力解决这个问题,我知道我可能犯了一个简单的错误,但如果有人能指出我正确的方向,那就太好了。

提前感谢您的帮助!

【问题讨论】:

  • 您能否更具体地说明在提及时要跳过哪个循环索引?你有两个嵌套循环; if ((1:length(files(i,1).day(j).hour)) ~= 24) 中的continue 将跳过for j=1:length(files(i,1).day) 循环的一次迭代,而if ((1:length(files(i,1).day(j).hour(h).halfhour)) ~= 2) 中的continueif sempty(1:length(files(i,1).day(j).hour)) 中的一个将跳过for h = 1:24 循环的迭代。
  • 我希望他们两个都能跳出 j 循环索引
  • 然后尝试用breaks 替换continues(见我的回答)

标签: matlab for-loop continue


【解决方案1】:

如果我理解正确,你想要的是:

for i=1:length(files)
    for j=1:length(files(i,1).day)
        if ((1:length(files(i,1).day(j).hour)) ~=  24)
            continue
        end
        for h = 1:24
            if ((length(files(i,1).day(j).hour(h).halfhour)) ~= 2)
                break
            end

            if isempty(files(i,1).day(j).hour)
                break
            end
            dayPSD = [];
            for h2=1:2
                dayPSD = [dayPSD; files(i,1).day(j).hour(h).halfhour(h2).data{8}'];
            end
        end
    end
end

因此,当满足任一条件时,执行流程将退出for h=.. 循环,并且由于for j=1... 循环中没有其他语句,代码实际上将跳过该迭代。

另请注意,if ((1:length(files(i,1).day(j).hour(h).halfhour)) ~= 2) 将向量 (1:length(..)) 与标量 2 进行比较,从而得出布尔向量。 if 部分只有在其所有元素都是 true 时才会执行,这很可能永远不会发生。

【讨论】:

  • 所以这对于第一条语句来说是正确的,但它似乎并没有跳过当 1:length(files(i,1).day(j).hour(h) 的迭代.halfhour)) ~= 2) 当它为空时。这是我遇到的这个问题,它不符合第二个条件
  • 嗯,您的条件1:length(files(i,1).day(j).hour(h).halfhour)) ~= 2 可能永远不会满足,因为您正在将向量与标量进行比较,从而产生布尔向量。这是你想要的吗?请参阅我的更新答案。
  • if 语句(或打印)中添加一个断点,看看你是否真的到达那里。
  • 你完全正确!我实际上将两个条件都更改为 if length(files(i,1).day(j).hour ~=24 和 if length(files(i,1).day(j).hour(h).halfhour) ~= 2. 非常感谢!我认为这可能是一件小事,需要额外的逻辑帮助,从 h 循环跳到 j 循环之外的下一个迭代。
猜你喜欢
  • 2013-09-02
  • 2017-05-07
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多