【问题标题】:Matlab euclidean pairwise square distance functionMatlab欧几里得成对平方距离函数
【发布时间】:2013-07-21 12:34:25
【问题描述】:

我有一个 60000 x 300 矩阵调用 X。我试图找到成对的欧几里德距离。我知道matlab(统计工具箱)中的pdist 函数可以做到这一点。但是,当我输入代码pdist(X) 时,我收到以下错误消息:

Error using pdistmex
Out of memory. Type HELP MEMORY for your options.

Error in pdist (line 252)
    Y = pdistmex(X',dist,additionalArg);

对修复有什么建议吗?矩阵尺寸是否太大?

【问题讨论】:

  • 您正好有 nchoosek(6e4,2) = 1799970000 对组合,总计 1799970000 * 8 字节 ~ 13.4108216 GB
  • 我在 wolframalpha 中进行了计算是不是很糟糕? :)
  • 最好坐下来想想为什么要这么远。是找到最小值/最大值吗?也许按需计算它们会更明智......

标签: matlab


【解决方案1】:

简单地说,是的,pdist 方法对您的内存非常渴望,而您的计算机无法满足它。例如,即使使用 6000 x 300 矩阵 X,我也可以使用 whos X Y 获得以下 X 和 Y 的可变大小:

>> whos X Y
  Name         Size                      Bytes  Class     Attributes

  X         6000x300                  14400000  double              
  Y            1x17997000            143976000  double    

现在我的记忆状态(在 32 位机器上):

>> memory
        Maximum possible array:             677 MB (7.101e+008 bytes) *

所以我真的通过计算Y = pdist(X) 来推动内存限制,因为这会产生一个大约 1.44 *10^8 字节的数组,而最大可能的数组大小大约是它的 5 倍。矩阵更大,您的系统可能会不满意。您的 60000 x 300 矩阵将生成一个包含 179970000 个值的 Y 数组!

如果您确实需要计算这种大小的矩阵的欧几里得距离,可能会有一些解决方法,如果是这样,我可能会为您提供更多帮助...

【讨论】:

  • Hrm... 是的,我正在尝试为某些类型的图像分割编写光谱聚类。部分代码需要这种成对的欧几里得距离。我尝试对这个函数进行硬编码,但 matlab 需要数小时到数天才能运行……有更快的解决方法吗?
  • 我明白了。把这个作为一个新问题扔到溢出上。
  • @voxeloctree:我几乎没有看到那里的区别,6e3(您的示例)与 6e4(OP 的数据):)
  • 对,这是为了制作一个例子,OP可以自己掌握pdist的内存压力。
猜你喜欢
  • 2013-04-07
  • 2014-01-17
  • 2013-03-02
  • 2020-05-31
  • 1970-01-01
  • 2015-07-15
  • 2014-02-04
相关资源
最近更新 更多