我是Matlab的新手。我想在python中找到一种迭代某些值的方法。
在python中它会喜欢它:
for i in [0, 90, 180, 360]:
print('degree', i)
但是,如何在Matlab中做到这一点?
答案 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(4x5x6
)5*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