繁体   English   中英

Matlab / Octave是否支持对矩阵切片进行操作?

[英]Does Matlab/Octave support operation on matrix slices?

我是Octave / Matlab的新手,所以到目前为止我知道,你可以应用矩阵运算(如* )或单元格运算(如.* )。

现在我遇到了这两种模式之间的问题。

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

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

  1. 手动循环遍历列,并添加向量

  2. 重复向量,然后将整个重复的向量(所以现在它真的是矩阵)添加到矩阵

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

问题 - 是否有一些不错的第三种方式切片模式? 我可以说,将矩阵视为切片,向切片添加矢量,然后放下这样的视图,并照常处理矩阵?

您可以在二进制单例扩展( 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解决方案通常更优越。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM