这个命令的含义是什么

时间:2012-08-03 06:34:04

标签: matlab

capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))

为什么当我使用该代码时,我的代码无法运行,并且有如下命令的命令?

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

1 个答案:

答案 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(慢),而是使用bsxfunfor - 循环(更快(是的,也是for - 循环),更好的可读性。

但这是一个意见问题(这与流行的意见相反:)