在 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) 我试图从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) 我想用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)
我没看到什么?
让我们假设我有一个数组 - 我将调用*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需要作为参数:
我正在寻找一些方法来通过f 引用(或通过指针?)而不是通过值将子数组作为参数传递给函数.
(解决这个问题的愚蠢方法是编写一个函数,在这个特定的情况下创建一个2*2数组并循环i和j复制原始数组中的值.但是,如果你处理相对较大的数组,这个会很贵.)
我发现存在一个cl-slice包但我不知道它是通过引用复制值还是访问数据.
arrays common-lisp pass-by-reference multidimensional-array pass-by-pointer
假设我有两个矩阵(以 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)我不是经验丰富的计算机科学家
我正在处理一个具有以下形式的文件:
"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以便它们成为浮点数?
common-lisp ×4
csv ×3
blas ×2
sbcl ×2
arrays ×1
awk ×1
bash ×1
dot-product ×1
io ×1
julia ×1
sed ×1
shell ×1
time-series ×1