使用单元阵列进行平方欧几里德计算

时间:2016-01-07 17:01:28

标签: arrays matlab functional-programming vectorization

我在几个月内开始了一个大学项目并且最初计划用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]

1 个答案:

答案 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