给出以下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
];
和两个包含行和列下标的变量(分别为r
和c
):
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
,它从r
和c
获取每个行和列组合,以便:
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
答案 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。