在Matlab中使用索引和值循环的简洁方法

时间:2013-05-06 09:35:05

标签: matlab

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

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

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

我正在寻找for item_i as item = itemsfor [item_i item] = items的语法。

4 个答案:

答案 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

希望它有所帮助。