通常矩阵不会被解释为索引列表,但如果你使用 sub2ind,你可以拥有它。要使用它,您需要您正在处理的矩阵的大小。让我们以a开头的示例:
a(sub2ind(size(a), I(:,1), I(:,2)))
如果您首先将新生成的矩阵分配给变量名,则代码不会改变。
将使用列I(:,1) 作为行,使用I(:,2) 作为列。
为了使代码更具可读性,您可以定义一个匿名函数来执行此操作,我们称之为 idx:
idx = @(m,I,i)(sub2ind(size(m), I(:,i), I(:,i+1)))
所以最后代码是
d = [a(idx(a,I,1)), b(idx(b,I,2)), c(idx(c,I,3))]
如果您首先将新生成的矩阵分配给变量名,则代码不会改变。
其他详情
让我们以 2 个中心矩阵为例:
a = rand(3,1) % 3 rows, 1 column
b = rand(3,3) % 3 rows, 3 columns
c = rand(3,3) % another squared matrix
d = rand(3,1) % 3 rows, 1 column
匿名函数的定义是一样的,只是改变输出向量的定义:
output = [a(idx(a,I,1)), b(idx(b,I,2)), c(idx(c,I,3)), d(idx(d,I,3))]
请记住,遵循该模式,您始终需要一个带有 (n_matrices + 1) 列的 I 矩阵。
泛化
让我们将这段代码推广到 n 个大小为 rxr 的中心矩阵和大小为 rxc 的“边矩阵”。我将在这个例子中使用这些参数的一些值,但你可以使用你想要的。
让我生成一个示例来使用:
r = 3;
c = 4;
n = 3;
a = rand(r,c); % 2D array
b = rand(r,r,n); % 3D array, along z = 1:n you have 2D matrices of size rxr
c = rand(r,c);
I = [1 3 1 2 1 3; 2 1 3 1 1 1];
我编写的代码可以使用cat 轻松扩展以追加矩阵(注意函数中的 2 告诉 MATLAB 在列的方向上追加)和 for 循环:
idx = @(m,I,i)(sub2ind(size(m), I(:,i), I(:,i+1)))
d = a(idx(a,I,1));
for i = 1:n
temp = b(:,:,i);
d = cat(2,d,temp(idx(tmp,I,i+1)));
end
d = cat(2,d,c(idx(c,I,n+1)));
如果您真的不想“手动”解决任何问题,您可以使用元胞数组将所有矩阵放在一起,然后循环地将匿名函数应用于元胞数组中的每个矩阵。