如何迭代某个值?

时间:2017-04-07 11:43:14

标签: matlab

我是Matlab的新手。我想在python中找到一种迭代某些值的方法。

在python中它会喜欢它:

for i in [0, 90, 180, 360]:
    print('degree', i)

但是,如何在Matlab中做到这一点?

2 个答案:

答案 0 :(得分:2)

简短版:

这样做:

myvar = [0, 90, 180, 360];
for i = 1:size(myvar, 2)
    ival = myvar(:, i);
    disp(['degree', num2str(ival)]);
end

长版:

MATLAB没有任何与Python迭代器等效的东西。它的循环规则根本不同。

您的代码实际上将使用Python编写的大致工作:

for i = [0, 90, 180, 360]
    disp(['degree', num2str(i)]);
end

然而,这是因为这是MATLAB中的一个特例,巧合的是,它恰好与Python中的结果相似。但是MATLAB正在做一些非常不同的事情,所以看似类似的代码可以在Python中运行,在MATLAB中默默地做一个完全不同的事情。

Python的循环规则依赖于迭代器协议,其中包含列表和numpy数组之类的可迭代类。一般来说,它会绕过"外部"序列。在嵌套列表中,它是最外面的列表。在numpy数组中,它是最后一个维度。

MATLAB的循环规则如下:如果矩阵具有两个以上的维度,则将矩阵展平为二维矩阵,然后在第二维上循环。换句话说,在将循环变量展平为2D矩阵之后,循环变量的n时间为您提供循环变量的n 。因此,在您的情况下,您有一个2D矩阵,其中第一个维度为1,第二个维度为4。所以它遍历第二维,给你4个1x1矩阵(在MATLAB中没有像Python中那样的1D或0D数据类型)。

但是,如果你有一个列向量,就像这样:

for i = [0; 90; 180; 360]
    disp(['degree', num2str(i)]);
end

你会收到一个错误:

Error using horzcat
Dimensions of matrices being concatenated are not consistent

...因为您可以获得1 1x1矩阵,而不是获得4 4x1矩阵,因为原始矩阵是4x1矩阵,因此第二维{{1} }}。如果您从1矩阵开始,则会获得5个4x5矩阵。如果您从4x1矩阵开始,您将获得30(4x5x65*6个矩阵。

此外,它始终返回您所使用的相同数据类型。因此,如果您从4x1单元格数组开始,您将获得1x4单元格数组,而不是单元格数组中的任何数组。因此,直接使用单元阵列也没有多大意义。

总的来说,这意味着在循环中直接使用变量,如下所示:

1x1

...在MATLAB中非常危险。只有在绝对100%确定for i = myvar % do something end 始终是行向量的情况下,这才能可靠地工作。但是如果你试图扩展代码,或者在新的情况下使用它,它可以默默地做错事。并且做其他MATLAB内部特性和功能也默默地做了错误的事情,这种代码似乎很容易工作,会给你一个完全错误的结果。

所以你很少在MATLAB中看到这种方法,人们通常做的是使用索引变量。它们在循环中创建一系列索引并循环遍历这些索引。一种常见的方法是

myvar

因此,在这种情况下,myvar = [0, 90, 180, 360]; for i = 1:length(myvar) ivar = myvar(i); end 是您要使用的i的索引。这种方法虽然很常见,但也很危险。与myvar numpy始终提供一致维度(第一个)不同,MATLAB中的len为您提供最长维度,无论可能是什么。因此,如果给定2D矩阵,它会无法预测。而且因为MATLAB将单个索引视为矩阵的扁平版本的索引,它将再次默默地做错误的事情。

因此,唯一安全的方法是使用length函数手动指定所需的维度,或者如果要循环遍历多维数组中的所有值,请使用size函数得到元素总数:

numel

答案 1 :(得分:-1)

for i = [0, 90, 180, 360]
    fprintf('degree %d\n', i)
end

所示:

degree 0
degree 90
degree 180
degree 360