基于行和列下标创建新矩阵



给定以下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

是的,您可以使用单个索引值(即列的连接)对2D矩阵进行索引——就像将矩阵逐列转换为向量一样。例如,您可以简单地使用A(8)访问A(4,2)

所以,你所需要做的就是创建一个新的索引矩阵然后访问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)

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

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

最新更新