我有一个矩阵A(MxN),需要使用A创建一个矩阵B(MxNxN),B(:,1,1) = A(:,1)
,B(:,2,2) = A(:,2)
,...,B(:,N,N) = A(:,N)
。目前我用,
B = zeros(size(A,1), size(A,2), size(A,2));
for i=1:size(B,3)
B(:,i,i) = A(:,i);
end
是否可以使用repmat
或任何其他方法使此代码运行速度比现在快?
答案 0 :(得分:4)
可以在B
的最后两个维度上使用"partial" linear indexing完成,如下所示:
[M, N] = size(A);
B = zeros(M, N, N);
B(:, 1:N+1:N^2) = A;
答案 1 :(得分:3)
m = 3;
n = 4;
A = rand(m,n); % example data
C = bsxfun(@times,A,shiftdim(eye(n),-1));
shiftdim
用于将N×N单位矩阵映射到1×N×N阵列,然后乘以A
并在第一维上虚拟复制。这种方法应该既节省内存又快速。与您的for
循环版本相比:
B = zeros(size(A,1), size(A,2), size(A,2));
for i=1:size(B,3)
B(:,i,i) = A(:,i);
end
然后isequal(B,C)
返回1
。
答案 2 :(得分:0)
如果我正确理解你想要做什么,这应该可以解决问题(你需要在我的示例中用4
或{{1}替换5
和M
}):
N
注意:我没有在MATLAB中检查上面的代码,我只使用>> A = rand(4, 5)
A =
0.8147 0.6324 0.9575 0.9572 0.4218
0.9058 0.0975 0.9649 0.4854 0.9157
0.1270 0.2785 0.1576 0.8003 0.7922
0.9134 0.5469 0.9706 0.1419 0.9595
>> B = permute(reshape(repmat(A, 1, 5), 4, 5, 5), [1 3 2]) ;
>> C = permute(reshape(repmat(eye(5, 5), 1, 4), 5, 5, 4), [3 1 2]) ;
>> T = C .* B
>> squeeze(T(1, :, :))
ans =
0.8147 0 0 0 0
0 0.6324 0 0 0
0 0 0.9575 0 0
0 0 0 0.9572 0
0 0 0 0 0.4218
进行了检查,但这应该是你想做的。以下是使用numpy
的{{1}}中的示例:
python