我在几个月内开始了一个大学项目并且最初计划用Java编写它,但我的导师建议我选择Matlab,因为它会更容易和更有效,所以我写了一些证明概念原型来测试水域'。
现在我有一个单元格数组,我想找到(单元格)数组中元素的总平方和。换句话说,我需要遍历每个元素,找到它的均值,然后计算元素中每个点的距离是从该平均值开始,然后为每个元素计算得出这个值,并返回整个数组的单个数字。
这就是我接触它的方式:
function squared_sum = sumsquares(c_array)
squared_sum = 0
for i = 1:size(c_array,2)
c_element = cell2mat(c_array(1,i));
for j = 1:size(c_element,1)
square_distance = pdist2(c_element(j,:), mean(c_array{1,i})).^2; % sum of squares = euclidean distance squared
squared_sum = squared_sum + square_distance;
end
end
end
问题在于,这正是我用Java编写的方式。我知道功能范例应该更优雅,更少依赖于循环,所以我很好奇是否有更好的方法来写这个?
编辑:单元结构(1x4)类似于[28x3] [42x3] [8x3] [91x3]
答案 0 :(得分:3)
对于常规形状的单元格阵列(相同大小的单元格),您可以使用bsxfun
之类的 -
c_array3D = cat(3,c_array{:});
sqdiffs = bsxfun(@minus,c_array3D,mean(c_array3D,1)).^2;
squared_sum = sum(sqdiffs(:));
对于不规则形状的单元阵列,可以使用pdist2
来处理2D数组而不是1D数组,从而降低环路的复杂性,如下所示 -
squared_sum = 0;
for i = 1:size(c_array,2)
squared_sum = squared_sum + sum(pdist2(c_array{1,i}, mean(c_array{1,i})).^2);
end