Matlab代码性能改进

时间:2015-08-02 20:46:02

标签: arrays algorithm performance matlab multidimensional-array

我有一个矩阵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或任何其他方法使此代码运行速度比现在快?

3 个答案:

答案 0 :(得分:4)

可以在B的最后两个维度上使用"partial" linear indexing完成,如下所示:

[M, N] = size(A);
B = zeros(M, N, N);
B(:, 1:N+1:N^2) = A;

答案 1 :(得分:3)

以下是使用bsxfunshiftdim的方式:

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}替换5M }):

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