RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 608436
Accepted
mr.T
mr.T
Asked:2020-12-27 18:50:55 +0000 UTC2020-12-27 18:50:55 +0000 UTC 2020-12-27 18:50:55 +0000 UTC

需要使用 Rccp 将 dtw 算法移植到 R

  • 772

R 有一个包含 dtw 算法的包,但它非常慢,我决定用从这里用 C++ 编写的 dtw 替换它 。我马上说,我只是在学习编程,R 是我的第一语言,我不熟悉其他语言,尤其是 c++,所以如果我不懂,请不要感到惊讶有些东西,哪怕是非常微不足道的东西……

我需要从函数中获取两个任意长度的向量作为输入,并给出这些向量之间的欧几里德距离作为接近度的度量,就是这样......尽可能快和尽可能短

所以我从上面的链接中获取代码并尝试使用 Rccp 将其集成到 R 但是它没有用,在我看来,一开始声明变量及其类型是不正确的

#include <Rcpp.h>

using namespace Rcpp;




DEFUN_DLD (dtw3, args, , "Find DTW of two signals with window")
{

  int nargin = args.length();

  if (nargin != 2)
    print_usage();

  Matrix A = args(0).array_value();
  Matrix B = args(1).array_value();

  octave_stdout << "Size of A is " << A.length() << std::endl;;
  octave_stdout << "Size of B is " << B.length() << std::endl;

  if (! error_state)
    {
      octave_idx_type n = A.length();
      octave_idx_type m = B.length();

      Matrix results (n + 1, m + 1);

      for(octave_idx_type i = 0; i <= n ; i++)
        for(octave_idx_type j = 0; j <= m ; j++)
          results(i, j) = octave_Inf;
      results(0, 0) = 0;

      octave_idx_type win = abs (n-m);

      double cost = 0;

      for(octave_idx_type i = 1 ; i <= n ; i++)
        for(octave_idx_type j = std::max(1, i-win) ; j <= std::min(m, i+win) ; j++)
          {
            cost = abs(A(i-1) - B(j-1));
            results(i, j) = cost + std::min(std::min(results(i-1,j),results(i,j-1)),results(i-1,j-1));
          }

      //octave_stdout << results << std::endl;
      return ovl(results(n, m));
    }
}

你能告诉我这段代码需要改变什么吗?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Artem Klevtsov
    2020-12-31T20:12:10Z2020-12-31T20:12:10Z

    等效代码Rcpp:

    #include <Rcpp.h>
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    double dtw_rcpp(const NumericVector& x, const NumericVector& y) {
        size_t n = x.size(), m = y.size();
        NumericMatrix res = no_init(n + 1, m + 1);
        std::fill(res.begin(), res.end(), R_PosInf);
        res(0, 0) = 0;
        double cost = 0;
        size_t w = std::abs(static_cast<int>(n - m));
        for (size_t i = 1; i <= n; ++i) {
            for (size_t j = std::max(1, static_cast<int>(i - w)); j <= std::min(m, i + w); ++j) {
                cost = std::abs(x[i - 1] - y[j - 1]);
                res(i, j) = cost + std::min(std::min(res(i - 1, j), res(i, j - 1)), res(i - 1, j - 1));
            }
        }
        return res(n, m);
    }
    

    该算法本身也在维基百科上有描述。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5