簡體   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