capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))
爲什麼當我使用那段代碼時,我的代碼無法運行,並且有如下命令的命令?這條命令是什麼意思
??? Array dimensions must match for binary array op.
capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))
爲什麼當我使用那段代碼時,我的代碼無法運行,並且有如下命令的命令?這條命令是什麼意思
??? Array dimensions must match for binary array op.
所有這些都可以通過Matlab的文檔找到,這應該始終是您的第一步!
話雖如此,這裏是你的命令的細分:
cell2mat
:評估陣列中的所有元素的一些功能:根據一些格式定義
arrayfun
單元陣列轉換成一個矩陣。該函數可以是匿名函數(例如,@(b) sum(resulti == b,1)
)
sum
:在特定方向上求和矩陣的所有元素。方向1:向下行,方向2:沿着列等
nonzeros
:通過從輸入數組中刪除全零來形成新的數組。這將輸出一個列向量,與輸入的形狀無關。
unique
:返回輸入數組,刪除所有值的所有重複項。輸出也將被排序。
類型help [command]
或doc [command]
對所有這些命令的詳細信息
現在,這些組合成你的命令(我建議你這樣做!):
A = nonzeros(unique(resulti))
將返回列中所有的唯一條目矢量,刪除任何零。
B = arrayfun(@(b)sum(resulti==b), A, 'UniformOutput', false)
將在新創建的列向量A
的所有條目運行該函數@(b) sum(resulti == b,1)
,並收集它們在細胞陣列B
(細胞,因爲'UniformOutput'
設置爲false
)。此功能將簡單比較resulti
的每個元素與運行索引b
,並查找沿行的總計數。然後,終於,
capi = cell2mat(B)
將電池陣列B
轉換回正常Matlab的陣列。
該命令的目標似乎是計算每個柱面上的非唯一出現次數resulti
。正如@GuntherStruyf所暗示的那樣,這整個命令似乎是一個被黑了的,強制的單線程而不是易於管理的可讀代碼。我會親自選擇將它分成幾行,避免使用arrayfun
(慢),而使用bsxfun
或for
-loop(更快(是的,也是for
-loop),更好的可讀性)。
但是,這是見仁見智的問題(這違背民意:)
http://www.mathworks.de/help/techdoc/ref/arrayfun.html – CloudyMarble 2012-08-03 06:44:32
http://www.mathworks.de /幫助/ techdoc/REF/cell2mat。html – CloudyMarble 2012-08-03 06:44:37
如果'resulti'是一個行向量,它和'bsxfun(@ eq,resulti,nonzeros(unique(resulti)))'相同,所以檢查'resulti'的大小並且與你想要的相比較(參考那段代碼) – 2012-08-03 06:49:45