我的很多循环看起来像这样:
items = [3,14,15,92];
for item_i = 1:numel(items)
item = items(item_i);
% ...
end
这对我来说看起来有点乱。是否有一些循环结构可以让我循环遍历项目并同时携带索引?
我正在寻找类似于for item_i as item = items
or的语法for [item_i item] = items
。
我的很多循环看起来像这样:
items = [3,14,15,92];
for item_i = 1:numel(items)
item = items(item_i);
% ...
end
这对我来说看起来有点乱。是否有一些循环结构可以让我循环遍历项目并同时携带索引?
我正在寻找类似于for item_i as item = items
or的语法for [item_i item] = items
。
与克里斯泰勒的回答类似,您可以这样做:
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 函数需要更多的工作才能通用,但它是一个开始,并且对您的示例有效。
这对于小向量来说是可以的,但您不希望对任何相当大的向量执行此操作,因为性能将是一个问题。
我相信没有办法做到这一点。我过去使用的一个技巧是利用 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
是一个返回两个长度相同的矩阵的函数,但是......你不能。
我偶尔会做这样的事情
arr = {'something', 'something else'};
arrayfun(@(x, y)sprintf('%s (item %i)', x{:}, y), arr, 1:length(arr), ...
'UniformOutput', false)
但这仅在非常特定的情况下有用(特别是那些您将arrayfun
用来缩短语法的相同情况),老实说,在大多数情况下,您最初的做法可能更好 - 其他任何事情都可能会混淆您的意图。
这对你有用吗?
k = 0;
for ii = items
k = k + 1; %% The index
item = ii;
% ...
end
希望能帮助到你。