Rewriting a vector addition and multiplication.

2 ビュー (過去 30 日間)
hello_world
hello_world 2016 年 8 月 16 日
回答済み: James Tursa 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.
I will appreciate any advise.

採用された回答

Thorsten
Thorsten 2016 年 8 月 16 日
編集済み: Thorsten 2016 年 8 月 16 日
Repmat is your friend here:
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 件のコメント
Thorsten
Thorsten 2016 年 8 月 16 日
編集済み: 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
James Tursa 2016 年 8 月 16 日
D = bsxfun(@plus,sum(A.^2, 2),sum(B.^2, 2)') - 2.*(A*B');

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by