对涉及3D矩阵的Matlab双循环进行矢量化?

对涉及3D矩阵的Matlab双循环进行矢量化?,matlab,Matlab,在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); 我想创建一个维度为(M*N)x(N-1)xR的矩阵B,以便 -对于每个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(:,

在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);
我想创建一个维度为
(M*N)x(N-1)xR
的矩阵
B
,以便

-对于每个
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, 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

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