Arrays 单元阵列的平方欧氏计算

Arrays 单元阵列的平方欧氏计算,arrays,matlab,functional-programming,vectorization,Arrays,Matlab,Functional Programming,Vectorization,我在几个月后开始了一个大学项目,最初计划用Java编写,但我的导师建议我学习Matlab,因为它会更简单、更高效,所以我正在编写一些概念验证原型来“测试水域” 现在我有一个单元格数组,我想找到(单元格)数组中元素的总平方和。换句话说,我需要遍历每个元素,找到它的平均值,然后计算元素中每个点与这个平均值的距离,然后对每个元素求和,并返回整个数组的单个数字 我就是这样做的: function squared_sum = sumsquares(c_array) squared_sum = 0 for

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

对于规则形状的单元阵列(大小相同的单元),可以这样使用-

c_array3D = cat(3,c_array{:});
sqdiffs = bsxfun(@minus,c_array3D,mean(c_array3D,1)).^2;
squared_sum = sum(sqdiffs(:));
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
对于不规则形状的单元阵列,您可以通过使用
pdist2
处理二维阵列而不是一维阵列来降低循环复杂性,如下所示-

c_array3D = cat(3,c_array{:});
sqdiffs = bsxfun(@minus,c_array3D,mean(c_array3D,1)).^2;
squared_sum = sum(sqdiffs(:));
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

c_数组
是什么样子的?添加示例案例?请确保在发布之前仔细检查源代码以确保其运行。代码的第四行已经有错误(即缺少括号)。如果单元格结构是
(1x4)
,并且单元格是
[28x3]
[42x3]
[8x3]
[91x3]
,它不会在
单元格2mat(c_数组{1,i})
上抛出错误吗?你说得对。应该是cell2mat(c_数组(1,i)),抱歉(我意外地遇到了复制和粘贴问题)。在MATLAB中编码时避免使用
i
j
sum
。哇,当使用1个循环而不是2个循环时,程序运行速度惊人。这很酷,谢谢@JHick尝试切换原始脚本中循环的顺序,看看会发生什么。@JHick您刚刚被分割,这是我们说您得到了一盘矢量化和快速代码的方式。我希望你喜欢这次经历!顺便说一句,Divakar又干得不错+1.@rayryeng我刚得到动词ed,呃!:)