我是Octave / Matlab的新手,所以到目前为止我知道,您可以应用矩阵运算(如*
)或单元格运算(如.*
)。
现在我遇到了这两种模式之间的问题。
例如(这只是示例)我有一个矩阵(10,10)和一个向量(10,1)。我想在切片中使用这个矩阵(在这种情况下是列切片)并向它们添加向量。因此,向第一列添加向量,向第二列添加向量,....,向最后一列添加向量。并且在结果中获取矩阵(10,10)当然。
到目前为止,我提出了两种方法:
手动循环遍历列,并添加向量
重复向量,然后将整个重复的向量(现在它真的是矩阵)添加到矩阵
第二个使用矢量化方法,但是消耗内存很多,在第一种情况下,没有矢量化方法(手动循环),但内存没有被过度使用。
问题 - 是否有一些不错的第三种方式切片模式?我可以说,将矩阵视为切片,向切片添加矢量,放弃这样的视图,并照常处理矩阵?
答案 0 :(得分:5)
你可以在二进制单例扩展(bsxfun)中使用Matlab的bult以内存有效的方式实现你想要的结果。
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解决方案通常更胜一筹。