0

我正在尝试在 matlab 中实现算法,该算法采用一组点和一个称为锚点的子集,该算法的工作原理如下:

  1. 找到最远的两个锚点
  2. 通过将每个点与最近的锚点相关联,将点分成两组
  3. 递归地重复这个过程,直到每组只有一个锚点
  4. 返回具有一个锚点的组

问题是 MatLab 不允许通过引用修改数组,尽管这些组是制定的,但我无法以适当的方式返回它们。

我该如何克服这个问题?

以下是我的代码:

function [part1, part2, part1anchors, part2anchors] = iterativeSpletting(points, anchors)
dist = @(a, b) ((a.xd - b.xd) ^ 2 + (a.yd - b.yd) ^ 2) ^ 0.5;

%find farthest two anchors
[ch1, ch2] = FarthestPoints(anchors);

%find parts
for i = 1:numel(points)
    if (dist(points(i), ch1) <= dist(points(i), ch2))
        part1 = [part1, points(i)];
    else
        part2 = [part2, points(i)];
    end
end

%assing anchors to parts
for i = 1:numel(anchors)
    if (dist(anchors(i), ch1) <= dist(anchors(i), ch2))
        part1anchors = [part1anchors, anchors(i)];
    else
        part2anchors = [part2anchors, anchors(i)];
    end
end

if numel(part1anchors) == 1
    %how to return the part    
else
    iterativeSpletting(part1, part1anchors)
end

if numel(part2ch2) == 1
    %how to return the part
else
    iterativeSplitting(part2, part2anchors)
end
end
4

1 回答 1

1

通过引用捕获闭包。如果你想递归地修改一个大数组,你可以这样编码:

function MyArray = foo()
    MyArray = zeros(1, 100);
    function bar(l, r)
        if l < r
            MyArray(l:r) = MyArray(l:r) + 1;
            bar(l+1, r - 1);
        end
    end      
    bar(1, 100);          
end

A = f(A)也可以正常工作(Matlab 通常会对其进行优化以避免不必要的复制)

于 2013-05-31T00:39:11.383 回答