我的很多循环看起来像这样:
items = [3,14,15,92];
for item_i = 1:numel(items)
item = items(item_i);
% ...
end
这对我来说有点乱。是否有一些循环结构允许我循环遍历项目并同时携带索引?
我正在寻找for item_i as item = items
或for [item_i item] = items
的语法。
答案 0 :(得分: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
枚举功能需要更多的工作才能成为一般用途,但这是一个开始,并且适用于你的例子。
对于小向量,这是可以的,但是你不希望用任何大小的向量做这个,因为性能会是一个问题。
答案 1 :(得分: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
但这并不比你原来做的更好。如果你能用Python那么就可以了。
for [index,item] = enumerate(items)
# loop body
end
其中enumerate
是一个函数,它返回两个长度相同的矩阵,但是......你不能。
答案 2 :(得分:2)
我偶尔会做这样的事情
arr = {'something', 'something else'};
arrayfun(@(x, y)sprintf('%s (item %i)', x{:}, y), arr, 1:length(arr), ...
'UniformOutput', false)
但这只适用于非常具体的情况(特别是那些使用arrayfun
来缩短语法的情况),说实话,你最初的做法对大多数情况来说可能更好 - 其他任何东西都可能会模糊你的意图。
答案 3 :(得分:1)
这对你有用吗?
k = 0;
for ii = items
k = k + 1; %% The index
item = ii;
% ...
end
希望它有所帮助。