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