Python枚举的Matlab等价物
在Python中,我们有一个方便的函数Python枚举的Matlab等价物,python,matlab,Python,Matlab,在Python中,我们有一个方便的函数枚举: for i,item in enumerate(foo_list): do something 是否有一个与枚举等效的Matlab 现在,我能想到的是如下内容(Matlab代码): 据我所知,在Matlab中没有枚举的等价物。最常见的方法是: for i = 1:length(foo_list) item = foo_list(i); % do stuff with i, item end 在Matlab中似乎没有等价物。
枚举
:
for i,item in enumerate(foo_list):
do something
是否有一个与枚举等效的Matlab
现在,我能想到的是如下内容(Matlab代码):
据我所知,在Matlab中没有枚举的等价物。最常见的方法是:
for i = 1:length(foo_list)
item = foo_list(i);
% do stuff with i, item
end
在Matlab中似乎没有等价物。但是,如果您有一个简单的1 x阵列,您可以自己定义它(如果您不担心性能):
当然,干净的方法是将其封装在一个通用工具包中,并添加一个断言a确实是一个1x向量 为迭代定义一个新类很容易实现:
classdef enumerate < handle
properties(Access = private)
IterationList;
end
methods
function self = enumerate(in)
self.IterationList = in;
end
function [varargout] = subsref(self, S)
item = subsref(self.IterationList,S);
num = S.subs{2};
out.item = item;
out.num = num;
varargout = {out};
end
function [m,n] = size(self)
[m,n] = size(self.IterationList);
end
end
end
并将获得以下输出:
数值为:1项目为:0
数值为:2项目为:0.11111
数值为:3项目为:0.22222
数量为:4项目为:0.33333
数值为:5项目为:0.444
数量为:6项目为:0.55556
数值为:7项目为:0.66667
数值为:8项目为:0.77778
数值为:9项目为:0.88889
数量为:10项为:1
(1) 这是最好的。(2) 如果
foo_list
不是1D,那么使用numel
可能比使用length
更可靠…@Shai每个人都使用i
作为索引,这不会改变,无论人们推荐什么。如果您确实需要复数,因此最好使用1i
而不是i
,以避免混淆。我认为这是Matlab的一个设计错误,他们给了这样一个公共变量一个特殊的含义,而我在问题中没有具体说明。在Python中,我们可以使用对范围内的i=1(len(foo_list)):
执行相同的操作,但我们还有枚举
,这更优雅。“每个人都使用i
作为索引”显然是错误的。甚至在使用MATLAB之前,我就使用了ii
。在当时,在源代码中搜索“ii”要比搜索“i”容易得多,后者需要更复杂的regex搜索命令。我仍然看到很多人在循环中使用ii
,即使这只是出于习惯。@jubobs,我同意你的看法。我以前支持过类似的建议,但我记得它被取消了。我来看看这个网站。这是个不错的主意,但这会大大减慢循环速度。自定义类在MATLAB中总是比内置类型慢很多。嗨,克里斯,谢谢你指出这一点!是的,该类重载内置方法subsref。我想JIT在这里不太管用。
enumerate = @(values) [1:length(values); values]
a = [6 5 4]
for i=enumerate(a)
do something with i
end
classdef enumerate < handle
properties(Access = private)
IterationList;
end
methods
function self = enumerate(in)
self.IterationList = in;
end
function [varargout] = subsref(self, S)
item = subsref(self.IterationList,S);
num = S.subs{2};
out.item = item;
out.num = num;
varargout = {out};
end
function [m,n] = size(self)
[m,n] = size(self.IterationList);
end
end
end
for t = enumerate(linspace(0,1,10));
disp(['num is: ',num2str(t.num),'item is: ',num2str(t.item)]);
end