根据行和列下标创建新矩阵

时间:2015-10-20 00:22:48

标签: matlab

给出以下4x6矩阵A

A = [
10 11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27
28 29 30 31 32 33
];

和两个包含行和列下标的变量(分别为rc):

r = [
1 1 1
1 1 1
3 3 3
3 3 3
4 4 4
];

c = [
1 3 6
1 2 4
1 2 6
1 4 5
1 5 6
];

我想创建一个新的5x3矩阵B,它从rc获取每个行和列组合,以便:

B = [
10 12 15
10 11 13
22 23 27
22 25 26
28 32 33
]; 

请注意,元素B(1,1)是使用r(1,1)作为行下标而c(1,1)作为列下标而派生的。元素B(1,2)r(1,2)c(1,2)作为行和列下标。等等...

我可以使用嵌套的for循环解决这个问题,但我正在处理的实际应用程序有非常大的矩阵,这种方法会导致严重的瓶颈。是否有更好的(阅读:更快)替代方案?

for循环供参考:

B = NaN(size(r,1),size(c,2));
for row=1:size(r,1)
    for col=1:size(c,2)
        B(row,col) = A(r(row,col),c(row,col));
    end
end

2 个答案:

答案 0 :(得分:4)

是的,您可以使用单个索引值(即列的串联)索引2D矩阵 - 例如将列矩阵逐列转换为矢量。例如,您只需使用A(4,2)即可访问A(8)

因此,您需要做的就是创建一个新的索引矩阵,然后在这些值处访问A:

% input data array
A = [10 11 12 13 14 15;
16 17 18 19 20 21;
22 23 24 25 26 27;
28 29 30 31 32 33];

% number of rows
N_rows = size(A,1);

% row indices
r = [1 1 1;
1 1 1;
3 3 3;
3 3 3;
4 4 4];

% column indices
c = [1 3 6;
1 2 4;
1 2 6;
1 4 5;
1 5 6];

% element indices
idx = (c - 1)*N_rows + r;

% new indexed array
B = A(idx);

% display outputs
disp(B)

答案 1 :(得分:0)

您可以使用sub2ind函数将下标(r,c)转换为线性索引('单个索引值')。

如果您需要反向转换,请使用ind2sub。