capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))
为什么当我使用该代码时,我的代码无法运行,并且有如下命令的命令?
??? Array dimensions must match for binary array op.
答案 0 :(得分: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)
将在新创建的列向量@(b) sum(resulti == b,1)
的所有条目上运行函数A
,并将它们收集在单元格数组B
中(单元格,因为'UniformOutput'
是设为false
)。此函数将简单地将resulti
的每个元素与正在运行的索引b
进行比较,并找到沿行的总计数。最后,
capi = cell2mat(B)
会将单元格数组B
转换回普通的Matlab数组。
此命令的目标似乎是计算resulti
每个列的非唯一出现次数。正如@GuntherStruyf所暗示的那样,这整个命令看起来像是一个黑客攻击,强制一行,而不是易于管理的可读代码。我个人会选择将其分成几行,避免arrayfun
(慢),而是使用bsxfun
或for
- 循环(更快(是的,也是for
- 循环),更好的可读性。
但这是一个意见问题(这与流行的意见相反:)