2012-08-03 157 views
-1
capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false)) 

爲什麼當我使用那段代碼時,我的代碼無法運行,並且有如下命令的命令?這條命令是什麼意思

??? Array dimensions must match for binary array op. 
+0

http://www.mathworks.de/help/techdoc/ref/arrayfun.html – CloudyMarble 2012-08-03 06:44:32

+0

http://www.mathworks.de /幫助/ techdoc/REF/cell2mat。html – CloudyMarble 2012-08-03 06:44:37

+0

如果'resulti'是一個行向量,它和'bsxfun(@ eq,resulti,nonzeros(unique(resulti)))'相同,所以檢查'resulti'的大小並且與你想要的相比較(參考那段代碼) – 2012-08-03 06:49:45

回答

1

所有這些都可以通過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(慢),而使用bsxfunfor -loop(更快(是的,也是for -loop),更好的可讀性)。

但是,這是見仁見智的問題(這違背民意:)