【问题标题】:Random move of dots in a matrix in matlabmatlab矩阵中点的随机移动
【发布时间】:2013-01-02 13:30:22
【问题描述】:

我有一个由 0 和 1 组成的矩阵。每个具有一个值的单元格表示一个非空单元格。 带有这些的单元格保存在带有坐标的向量中。 我正在遍历列表并将每个元素随机移动到其空闲的相邻单元格之一。

有没有办法通过向量运算来做到这一点?

谢谢

【问题讨论】:

  • 点可以相互移动,还是有排斥力?矢量运算意味着你需要能够平行移动。
  • 它们不能相互重叠。每个单元格只有一个点:|
  • 因为这可以在一维循环中实现,所以我认为 for 循环会比“矢量化”arrayfun 更快。
  • 您是否分析过您的代码以确定瓶颈在哪里?这样一个小问题应该很快,只要你只用它们的坐标来表示点,而不是试图在每次迭代中创建零和一个矩阵(这完全没有必要,最后可以是矢量化操作模拟)

标签: matlab vector matrix coordinates


【解决方案1】:

这是一种尝试,不是最优雅或最有效的尝试,但它仍然应该有效。

首先我假设您有非空单元格的 x,y 坐标,类似于

c=[x y];

二维数组中 8 个最近邻 (n.n.) 的相对位置由下式给出:

nn=[1 1;1 -1;-1 1;0 -1;-1 0;0 1;1 0;-1 -1];

让我们对c 中每个 x,y 坐标的 n.n 进行所有可能的排列。

permc=bsxfun(@plus,repmat(c,[1 8]),nn(:)');

现在设置一个随机 n.n 的向量。在每个 x,y 坐标的 8 个选项中:

ri=randi(8,numel(x), 1);

并用它来随机选择新坐标

new_c= [ permc(sub2ind(size(permc), (1:numel(x))', 2*ri-1 )) , ...
         permc(sub2ind(size(permc), (1:numel(x))', 2*ri))];  

问题:

  • 代码不检查是否有 n.n.这不是免费的,手头有cpermc 的信息不难解决。

  • 代码不关心点是否位于数组的边缘,因此它可以选择比数组大小大 0 或 1 的坐标。同样,permc 有处理此案的信息,可以通过多种方式单独处理。

就是这样。

【讨论】:

    【解决方案2】:

    可能,但我认为写起来会很棘手。您必须小心防止两个“点”同时移动到同一个空白位置。

    遍历向量并一次处理一个点似乎要容易得多。你想用向量运算来做这件事的原因是什么?如果您希望更快地编写代码,请发布您的代码并寻求建议。

    【讨论】:

    • 速度。如果我有一个由 5000 个点填充的 10,000 个单元矩阵,那么列表的每次完整迭代都会非常慢。
    • 对我来说听起来像是 mex 扩展的绝佳候选人。应该很容易在 C 中编写为直接循环。
    • 请记住,Matlab 有一个用于加速 for 循环的 JIT。因此,循环不应像以前那样令人恐惧。请在此处查看我的答案以获取更多详细信息:stackoverflow.com/questions/14035365/…
    猜你喜欢
    • 2012-01-12
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多