2012-04-26 37 views
3

我是Octave/Matlab的新手,所以到目前为止我知道,您可以应用矩阵运算(如*)或单元格运算(如.*)。Matlab/Octave支持对矩阵切片进行操作吗?

现在我有这两种模式之间存在的问题。

例如(这只是示例)我有一个矩阵(10,10)和一个向量(10,1)。我想在切片中使用这个矩阵(在这种情况下是列切片)并向它们添加矢量。因此,将矢量添加到第一列,将矢量添加到第二列,....,将矢量添加到最后一列。当然在结果获取矩阵(10,10)。

到目前为止,我想出了两种方法:

  1. 手动遍历列,并添加矢量

  2. 重复的载体,然后加入全部重复矢量(所以现在矩阵真的)到矩阵

第二个使用矢量化方法,但是消耗很多内存,在第一种情况下,没有矢量化方法(手动循环),但内存不会被过度使用。

问题 - 有没有一些不错的第三种方式,切片模式?我可以说,将矩阵视为切片,向切片添加矢量,并放弃这些视图,并像往常一样对待矩阵?

回答

5

您可以使用Matlab的bult进行二进制单例扩展(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/

对于乘法至少,可以实现使用涉及对角矩阵一招的结果。您可以使用关键字稀疏,减少内存使用量为对角矩阵的临时存储

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解决方案通常优于。

+1

sparse(diag(y))仍然构建完整的矩阵diag(y)。如果你真的想减少内存使用量,请使用:sparse(1:10,1:10,y) – 2012-04-26 11:12:49

+0

很好的答案,非常感谢! – greenoldman 2012-04-26 11:50:21

+0

我的荣幸。 :) – learnvst 2012-04-26 13:01:27