2017-04-07 80 views
2

我是Matlab的新手。我想在python中找到一种方式来遍历某些值。如何迭代某个值?

在蟒蛇,它希望它这样的事情:

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

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

回答

2

短版:

这样做:

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

龙版本:

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

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

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

然而,那是因为这是在MATLAB中的特殊情况,通过巧合,恰好有类似的结果的一个在Python中。但是MATLAB正在做一些非常不同的事情,所以看起来相似的代码在Python中将会默默地在MATLAB中做一个完全不同的事情。

Python的循环规则依赖于迭代器协议,迭代器类如列表和numpy数组。通常,它在“外部”序列上循环。在嵌套列表中,它是最外层的列表。在numpy数组中,它是最后一个维度。

MATLAB的循环规则如下:如果它有两个以上的维度,则将矩阵变平整为一个二维矩阵,然后在第二维上循环。换句话说,循环变量已经被平化为二维矩阵之后,通过循环的第二次循环向您提供了循环变量的列列。所以在你的情况下,你有一个二维矩阵,其中第一维是1,第二维是4。所以它循环遍历第二个维度,为您提供矩阵(在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 

...因为不是得到4个1x1矩阵您将获得1 4x1矩阵,因为原始矩阵是4x1矩阵,因此具有第二维1。如果您从4x5矩阵开始,您将得到5 4x1矩阵。如果以4x5x6矩阵开头,则会得到30(5*64x1矩阵。

而且,它总是返回你有在相同的数据类型。所以如果你开始一个1x4单元阵列,你会得到1x1电池阵列出来的,而不是无论是单元阵列中。因此,直接使用单元阵列也没有多大意义。

总体而言,这是什么意思是,直接在循环中使用的变量,像这样:

for i = myvar 
    % do something 
end 

...在MATLAB极其危险的。这只能可靠地运行,如果你可以绝对100%肯定myvar始终是一个行向量。但是,如果你试图扩展代码,或者在新的情况下使用它,它可以默默地做错误的事情。并且对其他MATLAB内部特性和函数做出默默做错的事情,这种代码似乎很容易工作,会给你一个完全错误的结果。

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

myvar = [0, 90, 180, 360]; 
for i = 1:length(myvar) 
    ivar = myvar(i); 
end 

因此,在这种情况下i是您要使用的myvar索引。这种方法虽然很普遍,但也很危险。不同于numpy其中len总是给出一致的维度(第一个),MATLAB中的length会给出最长的维度,无论这可能是什么。所以如果给出二维矩阵,它会发生不可预测的变化。而且,由于MATLAB将单个索引作为矩阵的扁平版本的索引,它将再次默默地做错误的事情。

所以这样做的唯一可靠的方法就是手动指定要使用size功能维度,或者如果你要循环多维数组中的所有值使用numel函数来获取元素的总数:

for i=1:size(myvar, 2) 
    ivar = myvar(:, i); 
end 

for i=1:numel(myvar) 
    ivar = myvar(i); 
end 
-1
for i = [0, 90, 180, 360] 
    fprintf('degree %d\n', i) 
end 

显示:

degree 0 
degree 90 
degree 180 
degree 360 
+0

这只会在OP的具体示例中起作用,但它不适用于迭代问题所要求的值的一般情况。在Python中,OP的例子不是特例,但在MATLAB中是这样。 – TheBlackCat