【问题标题】:Multiple loop variables Matlab多个循环变量 Matlab
【发布时间】:2023-03-29 16:59:01
【问题描述】:

C++/C 中,我们在一个循环中有多个循环变量,例如for(int i=0; int j=0; i<5; j<5; i++; j++) Matlab 中是否有任何用于多变量循环的工具? 而且,我在循环迭代中非常有意识计算,所以它会影响速度,因为我已经在 Matlab 中嵌套了循环。

【问题讨论】:

  • 如果ij 都遵循相同的开始和结束值,为什么不对i 使用循环,即for i=0:4,然后声明j=i?另外,我认为继续循环的条件必须是一个而不是多个 - i<5; j<5;.
  • 另外,在 C++ 中,命令需要用逗号分隔。您有三个部分,由两个分号分隔:for(INITIALIZATION; CONDITION; INCREMENT) command;。你的例子可能是这样的:for(int i=0, j=0; i<5 && j<5; i++, j++)

标签: matlab variables loops for-loop


【解决方案1】:

MATLAB sort of 支持多个循环变量,因为它支持矩阵作为循环表达式。这是如何运作的? 在每次迭代开始时将矩阵的各个列分配给循环变量。

示例代码:

V = [1:1:5; 2:2:10]
for iv = V,
    fprintf('iv = [%d %d];\n',iv);
end 

输出:

V =
     1     2     3     4     5
     2     4     6     8    10

iv = [1 2];
iv = [2 4];
iv = [3 6];
iv = [4 8];
iv = [5 10];

我们在这里实现了两个循环变量iv(1)iv(2),它们由用作循环表达式的矩阵的行指定。请注意,数组可以是任何类型(例如字符串、单元格、结构等)。

总结

预定义循环变量的每次迭代,并将它们存储为矩阵的行。 在循环内部,循环变量将包含矩阵的一列


旁注

我猜这个约定是colon operator 通过水平 连接而不是垂直连接产生一个数组的结果。只需考虑以下情况会发生什么:

for ii = (1:3).', numel(ii), end

您可能期望三个迭代,每个都指示 numel(ii)=1,但您只会得到 一个迭代,并且循环报告:

ans =
     3

如果您期望 ii 是一个标量,问题就很明显了。


术语

for loop_variable = loop_expression, statement, ..., statement end

【讨论】:

  • @AhsanAli 将 MATLAB for 循环表达式视为临时(常量)变量通常是有益的,以避免出现类似 this question 中的问题(链接到我的答案,因为它与要点相关)。
  • 哇.. +1。我刚刚注意到这一点。当您有 2 个数字列表时,这非常类似于 Python 中的 zip。真的很酷!
【解决方案2】:

MATLAB 不具备执行多个循环变量的能力,您必须使用嵌套的 for 循环。也就是说,MATLAB 的最大优势之一就是在数组中高效地应用函数。

例如:

a = zeros(1,5);
for i=1:5
    a(i) = sin(i);
end

b = sin(1:5);

在上面的例子中 a & b 是相同的,但是计算 b 不需要显式的 for 循环。有时需要显式 for 循环(包括嵌套循环)(例如通过 sim 命令运行模拟),但由于您担心计算循环迭代的时间,我猜您没有运行时间-大型模拟等密集型任务。

因此,与其使用嵌套的 for 循环,我会考虑设置您的函数以使用数组并将您的“循环变量”作为数组输入。查看命令 meshgrid 和 griddata 以帮助创建这些数组。

【讨论】:

    【解决方案3】:

    正如 chappjc 所指出的,并且正如 MathWorks 在文档中所述,for 循环的每次迭代都采用迭代器的下一列。因此,例如,要遍历列向量,必须转置它(即for ii = [1; 1; 2; 3; 5]'),否则ii 立即等于列向量。

    并且仅仅为了扩展 chappjc 的出色答案,您可以利用单元格的这种行为,此外,除了需要一个数字迭代器之外,您可能还有一些不同大小的字符串,然后您可以将它们处理为变量,以便您不必做太多的索引。这是一个粗略的例子:

    figure(1)
    imageList = {};
    for ii = [{somePath; someDirListing; 1}, {anotherPath; anotherDirListing; 2}] % Each iteration takes one column
    
        [pathname, images, iPos] = deal(ii{:});
    
        for iImage = images
            img = imread(fullfile(pathname, iImage));
            imagesc(img)
            axis image
            if iPos == 1
                title(['This is a left image, titled ' iImage])
            else
                title(['This is a right image, titled ' iImage])
            end
            pause(1)
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2011-10-21
      • 1970-01-01
      • 2021-12-31
      • 2018-07-12
      • 1970-01-01
      • 2016-09-12
      • 2015-04-17
      相关资源
      最近更新 更多