通过在每次迭代时省略一个索引来生成索引数组的循环

时间:2015-01-19 13:22:13

标签: matlab for-loop

使用for循环,如何编写代码来生成索引数组,在循环的每次迭代k,我将生成一个来自[1, 2, 3, ... N]的索引数组从集合中排除k

作为一个例子,如果我有k = 3次迭代,第一次迭代会给我索引(2,3),第二次迭代会给我索引(1,3),最后第三次迭代会给我指数(1,2)

5 个答案:

答案 0 :(得分:7)

方法#1

您可以在每次迭代时使用 setdiff 排除当前的迭代ID,就像这样 -

for iteration_id = 1:3
    indices = setdiff(1:3,iteration_id)
end

代码运行 -

indices =
     2     3
indices =
     1     3
indices =
     1     2

方法#2(矢量化)

您可以采用矢量化方法一次生成所有索引,如果必须使用这些索引,可以在循环内轻松使用 -

num_iters = 3; %// Number of iterations

all_indices = repmat([1:num_iters]',1,num_iters) %//'
all_indices(1:num_iters+1:end)=[]
valid_indices = reshape(all_indices,num_iters-1,[])'

代码运行 -

valid_indices =
     2     3
     1     3
     1     2

答案 1 :(得分:6)

另一种非常简单的方法:

N=3;
for k=1:N
    [1:k-1,k+1:N]
end

答案 2 :(得分:4)

使用

all_indices = [1 2 3]; %// these can be arbitrary numbers, not necessarily 1:N
N = numel(all_indices);
for n = 1:N
    selected_indices = all_indices([1:n-1 n+1:N]);
end

如果您希望一次生成所有内容,作为单个矩阵的行,则可以使用nchoosek

all_indices = [1 2 3]; %// again, these can be arbitrary numbers
selected_indices = nchoosek(all_indices, numel(all_indices)-1); %// generate combinations
selected_indices = flipud(selected_indices); %// put results in the intended order

在示例中,这给出了

selected_indices =
     2     3
     1     3
     1     2

答案 3 :(得分:4)

任何n

的另一种方式
 n = 3;
 [ii, ~] = find( ~eye(n) );
 indices = reshape( ii, n-1, [] ).'

答案 4 :(得分:2)

如果您不关心列的排序,您可以简单地使用:

n = 5;
indices = reshape(ones(n-1,1)*(n:-1:1),n,[]);

不完全是最不言自明的,但它滥用了矩阵indices的结构。

indices = 5     4     3     2
          5     4     3     1
          5     4     2     1
          5     3     2     1
          4     3     2     1