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

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

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

1 回答 1

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与运行的 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 :)

于 2012-08-03T09:06:06.600 回答