Python枚举的Matlab等价物

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中似乎没有等价物。

在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中似乎没有等价物。但是,如果您有一个简单的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