考虑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)
,将其与N-1
中的每个A(m,:,r)
剩余元素相加,然后填充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
大可能很慢。你能帮我矢量化吗?
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
答案 0 :(得分: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