2012-08-03 155 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),更好的可读性)。

但是,这是见仁见智的问题(这违背民意:)