您可以使用 Matlab 的 bult in binary-singleton-expansion ( bsxfun ) 以内存高效的方式实现您想要的结果。
x = ones(10); %// 10x10 matrix
y = 1:10; %// 10x1 matrix
z = bsxfun(@plus, x, y)
这将给出以下输出
z =
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
2 3 4 5 6 7 8 9 10 11
使用 repmat 命令通常是浪费的(正如您在问题中指出的那样),通常可以避免。有关 bsxfun 与 repmat 的详细说明,请参阅本文
http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/
至少对于乘法,您可以使用涉及对角矩阵的技巧来获得结果。您可以使用 sparse 关键字来减少对角矩阵临时存储的内存使用量
x = ones(10); %// 10x10 matrix
y = 1:10; %// 10x1 matrix
yd = sparse(diag(y)); %// 10x10 matrix, but memory is only used to store data and its indicies
z = yd * x %// 10x10 matrix
但是,bsxfun 解决方案通常更胜一筹。