8

我的很多循环看起来像这样:

items = [3,14,15,92];
for item_i = 1:numel(items)
    item = items(item_i);
    % ...
end

这对我来说看起来有点乱。是否有一些循环结构可以让我循环遍历项目并同时携带索引?

我正在寻找类似于for item_i as item = itemsor的语法for [item_i item] = items

4

4 回答 4

7

与克里斯泰勒的回答类似,您可以这样做:

function [ output ] = Enumerate( items )
output = struct('Index',num2cell(1:length(items)),'Value',num2cell(items));
end


items = [3,14,15,92];
for item = Enumerate(items)
   item.Index
   item.Value
end

Enumerate 函数需要更多的工作才能通用,但它是一个开始,并且对您的示例有效。

这对于小向量来说是可以的,但您不希望对任何相当大的向量执行此操作,因为性能将是一个问题。

于 2013-05-06T10:11:07.487 回答
5

我相信没有办法做到这一点。我过去使用的一个技巧是利用 Matlab 循环遍历矩阵的事实,因此您可以定义一个enumerate将索引行添加到矩阵顶部的函数:

function output = enumerate(x)
   output = [1:size(x,2); x];
end

然后像这样使用它:

for tmp = enumerate(items)
    index = tmp(1);
    item  = tmp(2:end);
end

但这并不比你最初做的更好。如果 à la Python 你可以这样就好了

for [index,item] = enumerate(items)
    # loop body
end

whereenumerate是一个返回两个长度相同的矩阵的函数,但是......你不能。

于 2013-05-06T09:50:34.493 回答
2

我偶尔会做这样的事情

arr = {'something', 'something else'};
arrayfun(@(x, y)sprintf('%s (item %i)', x{:}, y), arr, 1:length(arr), ...
    'UniformOutput', false)

但这仅在非常特定的情况下有用(特别是那些您将arrayfun用来缩短语法的相同情况),老实说,在大多数情况下,您最初的做法可能更好 - 其他任何事情都可能会混淆您的意图。

于 2013-05-06T09:53:53.623 回答
1

这对你有用吗?

k = 0;
for ii = items
  k = k + 1;  %% The index
  item = ii;  
  % ...
end

希望能帮助到你。

于 2013-05-06T09:44:18.163 回答