【问题标题】:Vectorising a Matlab double loop involving 3D matrices?向量化涉及 3D 矩阵的 Matlab 双循环?
【发布时间】:2017-12-06 16:12:26
【问题描述】:

考虑Matlab中的以下矩阵

A(:,:,1)=[1 2 3; 4 5 6];
A(:,:,2)=[7 8 9; 10 11 12];
M=size(A,1);
N=size(A,2);
R=size(A,3);

我想创建一个矩阵B,维度为(M*N)x(N-1)xR,这样

-对于每个r=1,...,R

-对于每个m=1,...,M

-对于每个h=1,...,N

-我取A(m,h,r),将其与A(m,:,r) 中剩余的每个N-1 元素相加,然后填充B((m-1)*N+h,:,r)

在上面的例子中应该是

B(:,:,1)=[1+2 1+3;
          2+1 2+3;
          3+1 3+2;
          4+5 4+6;
          5+4 5+6;
          6+4 6+5]

B(:,:,2)=[7+8 7+9;
          8+7 8+9;
          9+7 9+8;
          10+11 10+12;
          11+10 11+12;
          12+10 12+11]

此代码执行我想要的操作,但它包含一个双循环,对于 M,N large 可能会很慢。你能帮我矢量化吗?

for m=1:M
    for h=1:N
        B((m-1)*N+h,:,:)= repmat(A(m,h,:),1,N-1)+[A(m,1:h-1,:) A(m,h+1:N,:)]; 
    end
end

【问题讨论】:

  • 您的尺寸可以有多大?
  • M=400N=20R=200。此外,我必须重复这个双循环大约 1000 次。

标签: matlab


【解决方案1】:

我不确定它的效率会提高多少,但您可以像这样将其简化为一个循环:

[M, N, R] = size(A);
B = zeros(M*N, N-1, R);
for index = logical(eye(N))
  B(find(index):N:end, :, :) = bsxfun(@plus, A(:, ~index, :), A(:, index, :));
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2021-01-27
    • 2016-08-08
    • 2019-05-31
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多