以3个为一组提取列

时间:2015-08-27 13:49:30

标签: matlab indexing

如果我有一个16x12 double的矩阵,我怎么能在循环的每次迭代中提取3个集合中的列?

e.g。在循环的第一次迭代期间,采用第1列:第3列:

A= 
    2   3   0   2   3   0   1   3   1   3   0   0
    7   7   1   8   7   0   6   6   0   8   8   1
    4   3   0   3   2   0   3   3   0   3   2   0
    12  12  0   11  10  0   13  14  0   17  10  0
    5   6   0   5   2   0   5   5   0   4   2   0
    3   3   0   4   1   0   4   3   0   2   1   0
    6   14  0   8   11  0   8   9   0   8   5   0
    2   8   0   7   3   0   5   5   0   4   4   0
    4   4   0   3   2   0   5   7   0   5   3   0
    5   6   1   6   4   0   7   2   0   4   8   1
    5   7   1   5   5   0   4   13  0   4   5   0
    8   8   0   8   9   0   8   9   0   10  5   0
    7   9   0   9   6   0   9   8   1   9   4   0
    8   4   1   9   2   0   6   7   1   7   2   0
    11  10  0   8   11  1   9   9   0   11  6   0
    8   10  1   8   10  0   6   11  0   7   9   0

i = 1

2   3   0
7   7   1
4   3   0
12  12  0
5   6   0
3   3   0
6   14  0
2   8   0
4   4   0
5   6   1
5   7   1
8   8   0
7   9   0
8   4   1
11  10  0
8   10  1

i = 2

2   3   0
8   7   0
3   2   0
11  10  0
5   2   0
4   1   0
8   11  0
7   3   0
3   2   0
6   4   0
5   5   0
8   9   0
9   6   0
9   2   0
8   11  1
8   10  0

等等。

我只知道如何以复杂的方式做到这一点,指定每次迭代的列,即

for i=1:size(A,2)/3
    if i == 1
        array = A(:,1:3);
    elseif i == 2
        array = A(:,4:6);
    elseif i == 3
        array = A(:,7:9);
    elseif i == 4
        array = A(:,10:12);
    else
    end
end

然而,这不允许在不改变每次的情况下进行不同长度的调节。是否有简洁的方式来实现这一目标?

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。 我认为最简单的方法是使用迭代变量,每次增加三次。

>> A = [2   3   0   2   3   0   1   3   1   3   0   0
7   7   1   8   7   0   6   6   0   8   8   1
4   3   0   3   2   0   3   3   0   3   2   0
12  12  0   11  10  0   13  14  0   17  10  0]
A =

     2     3     0     2     3     0     1     3     1     3     0     0
     7     7     1     8     7     0     6     6     0     8     8     1
     4     3     0     3     2     0     3     3     0     3     2     0
    12    12     0    11    10     0    13    14     0    17    10     0

>> for i=1:3:12
A(:,i:i+2)
end

ans =

     2     3     0
     7     7     1
     4     3     0
    12    12     0


ans =

     2     3     0
     8     7     0
     3     2     0
    11    10     0


ans =

     1     3     1
     6     6     0
     3     3     0
    13    14     0


ans =

     3     0     0
     8     8     1
     3     2     0
    17    10     0

类似的方法是使用一个增加1的变量,每次选择3*i-23*i列。

破坏性方法,无需计数器,可以运行

B = A(:,1:3)
A(:,1:3) = []

每次尝试。这会将前三列复制到B,然后从A中删除它们。

答案 1 :(得分:1)

以下代码一次迭代SELECT 'Contact 1' AS "Phone 2 - Type", s1.Emerg_Phone_1 AS "Phone 2 - Value", 'Contact 2' AS "Phone 3 - Type", s1.Emerg_Phone_2 AS "Phone 3 - Value", 'Student Cell' AS "Phone 4 - Type", s2.STUDENTCELL AS "Phone 4 - Value", FROM STUDENTS s1 INNER JOIN STUDENTS2 s2 ON s1.student_id=s2.student_id 列的data列:

3

<强>输出

data = [2   3   0   2   3   0   1   3   1   3   0   0;
        7   7   1   8   7   0   6   6   0   8   8   1;
        4   3   0   3   2   0   3   3   0   3   2   0;
        12  12  0   11  10  0   13  14  0   17  10  0];

cols = size(data,2);
per_iteration = 3;
for k=1:per_iteration:cols
    selected = data(:,k:(k-1)+per_iteration);
    disp(selected);
end