# Rewriting a vector addition and multiplication.

3 次查看（过去 30 天）
hello_world 2016-8-16

Hello Friends,
I have the following:
A = [1 2 3; 4 5 6; 7 8 9];
B = [10 11 12; 13 14 15];
[N1, D1] = size(A);
[N2, D2] = size(B);
A_sq = sum(A.^2, 2);
B_sq = sum(B.^2, 2)';
D = A_sq(:,ones(1,N2)) + B_sq(ones(1,N1),:) - 2.*(A*B');
where D is N1 x D1 matrix.
I want to write expression for D in one single step, i.e., something like this:
D = sum(A.^2,2)(:,ones(1,N2)) + sum(B.^2,2)(ones(1,N1),:) - 2.*(A*B');
or perhaps something like this is even better:
D = sum[(A.^2,2)(:,ones(1,N2)) + (B.^2,2)(ones(1,N1),:) - . . .];
I know that above expression is wrong because one needs to store sum in a temporary variable before indexing. However, it is just for illustration purpose that I want to write down this expression in one single step.

### 采纳的回答

Thorsten 2016-8-16

D = repmat(sum(A.^2, 2), [1, N2]) + repmat(sum(B.^2, 2)', [N1, 1]) - 2*A*B';
or as a one-liner all together:
D = repmat(sum(A.^2, 2), [1, size(B, 1)]) + repmat(sum(B.^2, 2)', [size(A, 1), 1]) - 2*A*B';
##### 1 个评论显示 -1更早的评论隐藏 -1更早的评论
Thorsten 2016-8-16

I'm pretty sure that it is not possible in Matlab you compute something and then index into the result, like
(A.^2,2)(:,ones(1,N2))
But I agree that this would be quite nice to have.

### 更多回答（1 个）

James Tursa 2016-8-16
D = bsxfun(@plus,sum(A.^2, 2),sum(B.^2, 2)') - 2.*(A*B');

### 类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!