替换3d数组的指定切片中的行

时间:2017-03-27 10:20:42

标签: matlab

A成为n x n x m三维数组,B一个n x n矩阵,sel一个n x 1列,其中包含一个切片索引(在1..m中每行B

我将A指定的切片中的sel行替换为B的行:

for i = 1:n
    A(i,:,sel(i)) = B(i,:);
end

我想知道是否有一种方法可以使用sel直接访问需要替换的A元素,而不是for循环?

2 个答案:

答案 0 :(得分:0)

有一种方法可以对此进行矢量化,但我强烈建议不要使用它,因为它不清楚,我不认为它明显更快:

ind = bsxfun( @plus, (1:n)' + n*n*(sel-1), n*(0:n-1) );
A(ind) = B;

答案 1 :(得分:0)

一线解决方案

A(:,:,sel) = repmat(B,1,1,sum(sel))

代码示例

%defines input
m = 4; n = 2;
A = zeros(n,n,2);
A(:,:,1) = [0.6892, 0.4505; 0.7482, 0.0838];
A(:,:,2) = [0.2290, 0.1524; 0.9133, 0.8258];
A(:,:,3) = [0.5383, 0.0782; 0.9961, 0.4427];
A(:,:,4) = [0.1067, 0.0046; 0.9619, 0.7749];
B =   [0.8173, 0.0844; 0.8687, 0.3998];
sel = logical([1,0,1,0]);

%perform operation
A(:,:,sel) = repmat(B,1,1,sum(sel))

结果

B =
0.8173    0.0844
0.8687    0.3998

A(:,:,1) =
0.8173    0.0844
0.8687    0.3998

A(:,:,2) =
0.2290    0.1524
0.9133    0.8258

A(:,:,3) =
0.8173    0.0844
0.8687    0.3998

A(:,:,4) =
0.1067    0.0046
0.9619    0.7749