让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循环?
答案 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