【问题标题】:Normalized cuts with Matlab 2013a使用 Matlab 2013a 进行标准化切割
【发布时间】:2013-05-02 19:58:58
【问题描述】:

我正在使用来自http://www.cis.upenn.edu/~jshi/software/Ncut_9.zip 的标准化切割包 (在 Windows 7 上)

这曾经在 Matlab2010a 上运行良好。但是我已经升级到 Matlab2013a(32 位学生版),现在我收到以下错误:

Error using arpackc
Expect 2 output arguments

Error in eigs_new (line 240)
        arpackc( aupdfun, ido, ...

Error in ncut (line 83)
[vbar,s,convergence] =
eigs_new(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P));

Error in ncutW (line 9)
[NcutEigenvectors,NcutEigenvalues] =
ncut(W,nbcluster);

Error in NcutImage (line 18)
[NcutDiscrete,NcutEigenvectors,NcutEigenvalues]
= ncutW(W,nbSegments);

Error in demoNcutImage (line 25)
[SegLabel,NcutDiscrete,NcutEigenvectors,NcutEigenvalues,W,imageEdges]=
NcutImage(I,nbSegments);

显然ncuts中的new_eigs()函数与最新Matlab中的ARPACK版本不兼容。

  • 有人知道解决方法吗?
  • Normalised 使用 Matlab 的 eigs() 函数的修改版本。为什么我不能只使用 Matlab 的内置 eigs() 而不是 eigs_new()(它似乎确实有效)。

【问题讨论】:

  • 你能解释一下为什么eigs() 不适合你吗?

标签: matlab image-processing cluster-analysis image-segmentation arpack


【解决方案1】:

有两种解决方案:

  1. 使用 Matlab 的 eigs() 函数代替标准化切割包中提供的 eigs_new()。我猜eigs_new() 旨在解决与以前版本的 Matlab 的一些兼容性问题,现在它本身会导致问题。

  2. 修改eigs_new()。如果在eigs_new() 中有对arpackc() 的调用,请像在eigs() 的工具箱版本中那样进行调用。 所以,例如:

    arpackc( aupdfun, ido, ...
     bmat, intconvert(n), whch, nev, tol, resid, ncv, ...
        v, ldv, iparam, ipntr, workd, workl, lworkl, info );
    

变成

    [ido, info] = arpackc( aupdfun, ido, bmat, intconvert(n), whch, ...
        nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, ...
        lworkl, info );

只有两个地方需要更改才能使其正常工作(尽管还有其他对 arpackc() 的调用实际上并没有被执行)。

我仍然不确定为什么eigs_new() 存在。

【讨论】:

    【解决方案2】:

    在 matlab2014a 64 位窗口中, 你只会改变

    [vbar,s,convergence] = eigs_new(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P));
    

    在 ncut.m 的第 81 行 进入

    [vbar,s,convergence] = eigs(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P));
    

    然后 eigs_new.m 没用,不在乎。 因为在 2014 年(或超过 2009 年) arpackc 已被 eigs 取代。 您可以阅读 eigs 的帮助以获得更多帮助。

    【讨论】:

      【解决方案3】:

      前段时间我曾经使用过这段代码。对于 32-64 位问题,我做了一些更改。我还将这个eigs_new 行更改为

      [vbar,s,convergence] = eigs2(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P)); 
      

      应该可以...

      【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2019-07-07
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多