首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多回路变量Matlab

多回路变量Matlab
EN

Stack Overflow用户
提问于 2014-04-25 17:39:47
回答 3查看 7.3K关注 0票数 2

在C++/C中,我们在一个循环中有多个循环变量,就像for(int i=0; int j=0; i<5; j<5; i++; j++)一样,在Matlab中有用于多变量循环的工具吗?而且,我在循环迭代计算中非常清醒,它对速度也有影响,因为我在Matlab中已经是一个嵌套循环了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-25 20:55:10

MATLAB支持多个循环变量,因为它支持一个矩阵作为循环表达式。这是如何工作的?矩阵中的单独列在每次迭代开始时都分配给循环变量。

示例代码:

代码语言:javascript
复制
V = [1:1:5; 2:2:10]
for iv = V,
    fprintf('iv = [%d %d];\n',iv);
end 

输出:

代码语言:javascript
复制
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),它们由用作循环表达式的矩阵的行指定。注意,数组可以是任何类型(例如字符串、单元格、结构等)。

摘要

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

边注

我猜想,这个约定是一个事实的结果,即 operator通过水平级联而不是垂直方式生成数组。只需考虑在以下情况下发生了什么:

代码语言:javascript
复制
for ii = (1:3).', numel(ii), end

您可能需要三个迭代,每个迭代都指示numel(ii)=1,但是您只能得到一个迭代和循环报告:

代码语言:javascript
复制
ans =
     3

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

术语

代码语言:javascript
复制
for loop_variable = loop_expression, statement, ..., statement end
票数 9
EN

Stack Overflow用户

发布于 2014-04-25 17:55:49

MATLAB不具备执行多个循环变量的能力,您必须使用嵌套的for-循环。尽管如此,MATLAB最大的优点之一是有效地跨数组应用了一个函数。

例如:

代码语言:javascript
复制
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命令,以帮助创建这些数组。

票数 2
EN

Stack Overflow用户

发布于 2019-09-22 18:31:02

正如chappjc所指出的,并且正如MathWorks在文档中所述,for循环的每一次迭代都将接受迭代器的下一列。因此,要迭代一个列向量,例如,必须转换它(即for ii = [1; 1; 2; 3; 5]'),否则ii等于列向量,全部同时进行。

仅仅为了扩展chappjc的优秀答案,您可以利用这个行为,在单元格中,除了需要一个数字迭代器之外,您还可能有一些不同大小的字符串,然后您可以将它们处理到变量上,这样您就不必做那么多索引了。下面是一个粗略的例子:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23299617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档