我是Matlab的新手。我想在python中找到一种方式来遍历某些值。如何迭代某个值?
在蟒蛇,它希望它这样的事情:
for i in [0, 90, 180, 360]:
print('degree', i)
但是,如何做到这一点在Matlab?
我是Matlab的新手。我想在python中找到一种方式来遍历某些值。如何迭代某个值?
在蟒蛇,它希望它这样的事情:
for i in [0, 90, 180, 360]:
print('degree', i)
但是,如何做到这一点在Matlab?
短版:
这样做:
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*6
)4x1
矩阵。
而且,它总是返回你有在相同的数据类型。所以如果你开始一个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
for i = [0, 90, 180, 360]
fprintf('degree %d\n', i)
end
显示:
degree 0
degree 90
degree 180
degree 360
这只会在OP的具体示例中起作用,但它不适用于迭代问题所要求的值的一般情况。在Python中,OP的例子不是特例,但在MATLAB中是这样。 – TheBlackCat