matlab - Matlab/Octave 是否支持对矩阵切片的操作?

标签 matlab matrix operators octave slice

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

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

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

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

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

  2. 重复向量,然后将整个重复向量(现在它实际上是矩阵)添加到矩阵

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

问题 -- 是否有一些不错的第三种方式,切片模式?我可以说,将矩阵视为切片,将向量添加到切片,然后删除此类 View ,并照常处理矩阵?

最佳答案

您可以使用 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 解决方案通常更优越。

关于matlab - Matlab/Octave 是否支持对矩阵切片的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10331736/

相关文章:

java - 如何在 SparseDoubleMatrix2D (Java Colt 库)中找到最大值?甚至在一维矩阵中

c - 矩阵嵌套在另一个矩阵中

Perl "reverse comma operator"(来自《Programming Perl》一书的示例,第 4 版)

python-3.x - __ipow__ 在左侧对象返回 NotImplemented 时引发 TypeError

c++ - operator+ 和 operator= 如何一起使用?

matlab - 使用另一个变量对单个箭袋箭头进行颜色编码

MATLAB:导出为矢量图形后可见的补丁边缘

matlab:数据结束后绘图区域继续

matlab - 在 Matlab 中将纪元转换为日期

python - 如何使用 python numpy 将多个矩阵的函数应用于矩阵列表的每个元素?