MATLAB3: 矩陣分塊函數mat2cell 及 cellfun 函數
MATLAB 矩陣分塊函數 mat2cell 及 cellfun 函數
mat2cell 函數就是將矩陣轉化成胞元數組(cell array),用數學的語言講就是矩陣分塊。x是60*50的大矩陣。
cellfun 函數就是對每一個塊做相同的操作,例如求和、求均值等等,用這個函數就避免了寫 for 循環了,也算是 matlab 向量化運算的一個例子。
y=cell2mat(c)
這里y相當于大矩陣x
>> matrix
>> mc{1,1}
>> mc{1,2}
>> sum_of_everyone = cellfun(@(x) sum(x(:)), mc)
matlab中cell數組用法
cell數組一般被叫做元胞數組,它的每個單元可以儲存不同的數據類型,可以是數值,字符或矩陣或元胞數組等,類似于學過的c語言里的結構體
1.cell數組的創建
可以直接通過{}類似于矩陣的直接賦值:a={'winter',123,'coming','哈哈'};
也可以通過cell函數預分配內存,再賦值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
2.cell數組的訪問
與普通矩陣,數組的主要區別在于:通過()訪問cell數組時訪問到的是cell單元,通過{}訪問cell數組時訪問到的是cell單元儲存的內容,舉例如下圖所示,其他操作基本一樣。
3.cell數組相關的函數
cell:創建空的元胞數組,預分配內存
celldisp:顯示元胞數組所有內容
cellplot:利用圖形方式顯示內容(因缺思廳?。?br />
cell2mat:將元胞數組成普通矩陣(要求cell元胞數組的所有內容都必須為相同數據類型,可以為字符,會轉化為字符矩陣)
mat2cell:將普通矩陣轉化成元胞數組
iscell:判斷輸入是否為元胞數組
cellfun:為cell數組的每個cell單元執行指定的函數,fun可以是特殊的函數或者句柄
b={[1,2,1];[2,1,1];[1,1,2]};
c=cellfun(@(x)(mat2str(x)),b,'un',0)
更一般的例子參見https://cn.mathworks.com/matlabcentral/answers/99632-how-do-i-save-a-cell-array-that-contains-both-strings-and-numbers-to-an-ascii-file-in-matlab
4.cell單元的刪除
我們知道矩陣及矩陣的刪除可以通過[]實現:
元胞數組操作類似但和其賦值一樣有區別,區別就在于{}和()
a={1,2,3};
a{1}=[];%并不能刪除第一個cell單元,只是變成空值
a(1)=[];%刪除第一個單元
a(:)=[];%一次性刪除所有cell單元
如果p為一個數,那么h(1)=p,是沒有問題的。
如果p為一個向量,那么h(1,:)=p是沒有問題的。
如果p是一個矩陣的話,上面的兩種賦值方法都是會有錯誤的。
那么要如何處理呢?
這時就用到了cell數據類型了。cell的每個單元都可以存儲任何數據,比如傳遞函數等。當然,存儲矩陣更是沒有問題的了。但是用cell數據類型之前,要先初始化。
a=cell(n,m)
那么就把a初始化為一個n行m列的空cell類型數據。
如何賦值呢?
a{1,1}=rand(5)
那么a的1行1列的單元中存儲的就是一個隨機的5×5的方陣了。
那么要用第一個單元中的方陣中的某個值呢?
可以如下引用:a{1,1}(2,3)
就可以了,引用cell單元時要用{},再引用矩陣的某個數據就要用()了。
cell單元中的每個單元都是獨立的,可以分別存儲不同大小的矩陣或不同類型的數據。
cellfun函數的問題
你想實現什么功能?
str2num的作用是把字符串轉換為數值類型,字符串'00110011'轉為數值型當然就是110011了。
至于cellfun,無非是對于一個cell數組中的每個單元都進行str2num操作。
MATLAB胞元數組函數cellfun輸出錯出
就是一致性輸出的問題
如果函數返回的是一個標量,cellfun可以用一致輸出,函數會把輸出合并成一個矩陣
矩陣的維度大小和原來的cell數組的維度大小一致
如果函數返回不是標量,就不能用一致輸出
你的函數 返回的是3x1的矩陣,所以不能用一致輸出,必須用非一致輸出
B=cellfun(@(x)(A+E)*x,C,'UniformOutput',0)
怎樣用matlab計算一個矩陣和大量矩陣分別相乘
方法一,可以使用for循環;
方法二,可以使用cellfun函數.將大量矩陣保存成cell數組.
示例:
a=rand(3,2); %a某個矩陣
B={rand(2,2),rand(2,3),rand(2,4),rand(2,5),rand(2,6)}; %B大量矩陣組成的cell數組
C=cellfun(@(x)a*x,B,'UniformOutput',fal); %分別將矩陣a與B中每個矩陣相乘.
%C為結果,也是cell數組
由結果可知:
C{1} = a*B{1}
C{2} = a*B{2}
C{3} = a*B{3}
C{4} = a*B{4}
C{5} = a*B{5}