小编Dan*_*uko的帖子

在 Common Lisp 中快速读取 CSV

在 CL 中读取 csv 文件的最快方法是什么:1)第一行中的所有字段都进入一个名为“column-names”的数组 2)以下所有行的第一个字段进入另一个名为“column-names”的数组row-names 3) 所有其他字段都进入另一个名为 value 的数组吗?

我的文件具有以下形式,只是有更多的列和行:

"";"ES1 Index";"VG1 Index";"TY1 Comdty";"RX1 Comdty";"GC1 Comdty"
"1999-01-04";1391.12;3034.53;66.515625;86.2;441.39
"1999-01-05";1404.86;3072.41;66.3125;86.17;440.63
"1999-01-06";1435.12;3156.59;66.4375;86.32;441.7
"1999-01-07";1432.32;3106.08;66.25;86.22;447.67
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

#("1999-01-04" "1999-01-05" "1999-01-06" "1999-01-07" )
#("" "ES1 Index" "VG1 Index" "TY1 Comdty" "RX1 Comdty" "GC1 Comdty")
#(1391.12 3034.53 66.515625 86.2 441.39 1404.86 3072.41 66.3125 86.17 440.63
  1435.12 3156.59 66.4375 86.32 441.7 1432.32 3106.08 66.25 86.22 447.67)
Run Code Online (Sandbox Code Playgroud)

您是否知道某些 CL 库已经这样做了?是否存在我应该注意的有关 I/O 性能的一般问题(可能是特定于编译器的问题)?

这是我现在正在做的方式:

(with-open-file (stream "my-file.csv" :direction :input)
   (let* ((header (read-line stream nil))
          (columns-list (mapcar #'read-from-string
                                (cl-ppcre:split ";" header))) …
Run Code Online (Sandbox Code Playgroud)

csv io common-lisp

5
推荐指数
1
解决办法
2629
查看次数

从SBCL调用BLAS ddot例程

我试图从SBCL调用BLAS ddot例程.

基于:

我想出了以下脚本:

(load-shared-object "libblas.so.3")

(declaim (inline ddot))

(define-alien-routine ("ddot_" ddot) void
  (n int :copy)
  (dx (* double))
  (incx int :copy)
  (dy (* double))
  (incy int :copy))

(defun pointer (array)
  (sap-alien (sb-sys:vector-sap (array-storage-vector array)) (* double)))

(defun dot (dx dy)
  (unless (= (length dx) (length dy))
    (error "Vectors length does not match"))
  (let ((n (length dx))
    (result 0.0d0))
    (sb-sys:with-pinned-objects (dx dy result)
      (ddot n (pointer dx) …
Run Code Online (Sandbox Code Playgroud)

sbcl common-lisp blas dot-product

5
推荐指数
1
解决办法
203
查看次数

Julia TimeSeries包中的Readtimearray函数

我想用readtimearray读取以下形式的csv文件:

"","ES1 Index","VG1 Index","TY1 Comdty","RX1 Comdty","GC1 Comdty"
"1999-01-04",1391.12,3034.53,66.515625,86.2,441.39
"1999-01-05",1404.86,3072.41,66.3125,86.17,440.63
"1999-01-06",1435.12,3156.59,66.4375,86.32,441.7
"1999-01-07",1432.32,3106.08,66.25,86.22,447.67
"1999-01-08",1443.81,3093.46,65.859375,86.36,447.06
"1999-01-11",1427.84,3005.07,65.71875,85.74,449.5
"1999-01-12",1402.33,2968.04,65.953125,86.31,442.92
"1999-01-13",1388.88,2871.23,66.21875,86.52,439.4
"1999-01-14",1366.46,2836.72,66.546875,86.73,440.01
Run Code Online (Sandbox Code Playgroud)

但是,这是我评估readtimearray("myfile.csv")时得到的结果

ERROR: `convert` has no method matching convert(::Type{UTF8String}, ::Float64)
 in push! at array.jl:460
 in readtimearray at /home/juser/.julia/v0.3/TimeSeries/src/readwrite.jl:25
Run Code Online (Sandbox Code Playgroud)

我没看到什么?

csv time-series julia

3
推荐指数
1
解决办法
125
查看次数

在Common Lisp中通过引用(而不是值)传递子数组

让我们假设我有一个数组 - 我将调用*my-array*- 看起来像这样:

#2A((1 2 3)
    (4 5 6)
    (7 8 9))
Run Code Online (Sandbox Code Playgroud)

我希望在子阵列上应用一些函数f

#2A((5 6)
    (8 9))
Run Code Online (Sandbox Code Playgroud)

我很乐意写作

(f (subarray *my-array* '(1 2) '(1 2))
Run Code Online (Sandbox Code Playgroud)

这里subarray需要作为参数:

  • 原始数组
  • 一个2元素的列表,在第一维上有起点和终点
  • 另一个2元素列表,第二维上有起点和终点
  • 等等

我正在寻找一些方法来通过f 引用(或通过指针?)而不是通过值将子数组作为参数传递给函数.

(解决这个问题的愚蠢方法是编写一个函数,在这个特定的情况下创建一个2*2数组并循环i和j复制原始数组中的值.但是,如果你处理相对较大的数组,这个会很贵.)

我发现存在一个cl-slice包但我不知道它是通过引用复制值还是访问数据.

arrays common-lisp pass-by-reference multidimensional-array pass-by-pointer

3
推荐指数
1
解决办法
433
查看次数

使用 Common Lisp 中的 BLAS 进行矩阵乘法

假设我有两个矩阵(以 Common Lisp 数组的形式) foo 和 bar ,这样:

(defvar foo #2A((2 1 6) (7 3 4)))
(defvar bar #2A((3 1) (6 5) (2 3)))
Run Code Online (Sandbox Code Playgroud)

我想使用 BLAS 执行矩阵乘法,而不使用 Matlisp、GSLL、LLA 等包装器。这样我就得到一个包含结果的数组:

#2A((24 25) (47 34))
Run Code Online (Sandbox Code Playgroud)

我应该采取哪些步骤来执行此类操作?

我的理解是,我应该从 REPL 调用 BLAS 矩阵乘法函数,并将我的参数 foo 和 bar 传递给它。

在 R 中,我可以轻松地这样做:

foo %*% bar
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Common Lisp 中做到这一点?

免责声明:1)我使用 SBCL 2)我不是经验丰富的计算机科学家

sbcl common-lisp blas matrix-multiplication

2
推荐指数
1
解决办法
1383
查看次数

CSV文件上的文本处理

我正在处理一个具有以下形式的文件:

"1999-01-04";1391.12;3034.53;66.515625;86.2;441.39
"1999-01-05";1404.86;3072.41;66.3125;86.17;440.63
"1999-01-06";1435.12;3156.59;66.4375;86.32;441
Run Code Online (Sandbox Code Playgroud)

有时,有没有小数的值(例如441而不是441.0),我需要小数.如何编写一个脚本,以便添加所有整数.0以便它们成为浮点数?

csv bash shell awk sed

2
推荐指数
1
解决办法
85
查看次数