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)
@(b) sum(resulti == b,1)
将对新创建的列向量的所有条目运行该函数A
,并将它们收集在一个单元格数组中B
(单元格,因为'UniformOutput'
设置为false
)。此函数将简单地将 的每个元素resulti
与运行的 index进行比较b
,并找到沿行的总计数。然后,最后,
capi = cell2mat(B)
will convert the cell-array B
back to a normal Matlab array.
The objective of this command seems to be to count the number of non-unique occurrences on each of the colums of resulti
. As hinted at by @GuntherStruyf, this whole command seems a hacked-together, forced one-liner, rather than well-manageable, readable code. I would personally opt to break it over several lines, avoid arrayfun
(slow) and instead use bsxfun
or a for
-loop (faster (yes, also the for
-loop), better readable).
But that's a matter of opinion (which goes against popular opinion :)