- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个代码来使用 F# 执行一些基本的矩阵计算。我想知道此代码是否有一些可能的改进以减少计算时间。
实际上,执行的操作非常基本(主要是 2 个矩阵的乘法和转置),但是矩阵的大小很高(大约 10000 * 100000
)导致计算持续时间巨大(几个小时)。
我的问题/评论如下:
// I use the #time function to calculate the calculation duration of the algorithm
#time
#r "Microsoft.Office.Interop.Excel"
#r "FSharp.PowerPack.dll"
open System
open System.IO
open Microsoft.FSharp.Math
open System.Collections.Generic
// Algorithm
let matrixCalculation (matA : matrix) (matB : matrix) (matC : matrix) =
// First step : Renamed the matrix A and B size to initialize the matrix "matrixCalcul"
let nbrOfElementsA = matA.NumRows
let nbrOfElementsB = matB.NumRows
let nbrOfCaracteristicsA = matA.NumCols
let nbrOfCaracteristicsB = matB.NumCols
// Second step : MatB has to be transposed
let tmatB = matB.Transpose
// Initialisation of the final output named matrixCalcul. A weighted vector is also initialised
let mutable matrixCalcul = Matrix.create (nbrOfElementsA + 1) (nbrOfElementsB + 1) 0.
let mutable weightedVector = Matrix.create nbrOfCaracteristicsA 1 0.
// The first column of matA and matB represents IDs, and are "copy/past" in matrixCalcul's first colum and first row respectively
matrixCalcul.[1.. ,0..0] <- matA.[0..,0..0]
matrixCalcul.[0..0,1 ..] <- matB.[0..,0..0].Transpose
// Then the core of the matrix named "matrixCalcul" can be calculated
for j = 0 to (nbrOfElementsB - 1) do
weightedVector <- matC * tmatB.[1..(nbrOfCaracteristicsB - 1),0..(nbrOfElementsB-1)].Columns(j,1)
for i = 0 to (nbrOfElementsA - 1) do
let mutable acc = matA.[0..(nbrOfElementsA - 1),1..(nbrOfCaracteristicsA-1)].Rows(i,1) * weightedVector
matrixCalcul.[i+1,j+1] <- (acc.[0,0])
matrixCalcul
// Two matrix generators (one for matA and matB and another one for matC)
let matrixTestGeneratorAandB nbrOfElements nbrOfCaracteristics =
let matrixTestGeneratedAandB = Matrix.create nbrOfElements nbrOfCaracteristics 0.
|> Matrix.mapi (fun i j value -> if j = 0 then float(i + 1) elif j % 2 = 0 then 1. else 0.)
matrixTestGeneratedAandB
let matrixTestGeneratorC nbrOfElements nbrOfCaracteristics =
let matrixTestGeneratedC = Matrix.create nbrOfElements nbrOfCaracteristics 0.
|> Matrix.mapi (fun i j value -> if j = 0 then 0. elif j % 2 = 0 then 1. else 0.)
matrixTestGeneratedC
// Generation of matrixA, matrixB and matrixC
let matrixA = matrixTestGeneratorAandB 100 179
let matrixB = matrixTestGeneratorAandB 100 639
let matrixC = matrixTestGeneratorC 178 638
// Calculation
matrixCalculation matrixA matrixB matrixC
matrixA
的数量和
matrixB
高达
10000
,这可能需要一个小时。仅供引用,在我的算法中,
matrixC
的大小将保持不变,只有矩阵 A 和 B 的行数可以增加。
最佳答案
从您的代码中,很难理解您要实现的目标。我认为您的意思是计算矩阵 d[0..m, 0..n]
如下:
+---------+-------------------------+
| 0.0 | b00 b10 ...... b(n-1)0 |
+---------+-------------------------+
| a00 | d11 d12 ...... d1n |
| a10 | d21 d22 ...... d2n |
| ... | ... ... ...... ... |
| ... | ... ... ...... ... |
| ... | ... ... ...... ... |
| a(m-1)0 | dm1 dm2 ...... dmn |
+---------+-------------------------+
d[1..m, 1..n]
)是三个矩阵的乘积
matA1
(
matA
修剪第一列后),
matC
和
matB1
(
matB
修剪第一列并转置后)。
ra
,
ca
,
rb
,
cb
,
rc
和
cc
表示
matA
中的行数和列数,
matB
和
matC
分别。乘法在三个大小为
ra x (ca-1)
的矩阵之间进行,
rc x cc
和
(cb-1) x rb
;这仅在
rc = ca-1
时才有意义和
cc = cb-1
.我们有结果矩阵
d
尺寸
(ra+1) x (rb+1)
.
for
环形:
let calculate (matA : matrix) (matB : matrix) (matC : matrix) =
let ra = matA.NumRows
let ca = matA.NumCols
let rb = matB.NumRows
let cb = matB.NumCols
let matrixCalcul = Matrix.zero (ra+1) (rb+1)
matrixCalcul.[1.., 0..0] <- matA.[0.., 0..0]
matrixCalcul.[0..0, 1..] <- matB.[0.., 0..0].Transpose
matrixCalcul.[1.., 1..] <- (matA.Columns(1, ca-1) * matC) * matB.Columns(1, cb-1).Transpose
matrixCalcul
matA
测试过了,
matB
和
matC
大小分别为 200x279、200x1279 和 278x1238。两个版本产生相同的结果,我的函数是
40x
比原来的快。造成这种情况的原因有很多,但总的来说,向量化版本在矩阵计算方面具有更好的性能。
关于f# - F#中矩阵计算的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565489/
假设我有两个矩阵,每个矩阵有两列和不同的行数。我想检查并查看一个矩阵的哪些对在另一个矩阵中。如果这些是一维的,我通常只会做 a %in% x得到我的结果。 match似乎只适用于向量。 > a
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 个月前。 Improv
我只处理过 DirectX 矩阵 我读过一些文章,说不能将 DirectX 矩阵数学库用于 openGL 矩阵。 但我也读过,如果你的数学是一致的,你可以获得类似的结果。那只会让我更加困惑。 任何人都
我编写了一个C++代码来解决线性系统A.x = b,其中A是一个对称矩阵,方法是首先使用LAPACK(E)对角矩阵A = V.D.V^T(因为以后需要特征值),然后求解x = A^-1.b = V^T
我遇到了问题。我想创建二维数组 rows=3 cols=2我的代码如下 int **ptr; int row=3; int col=2; ptr=new int *[col]; for (int i=
我有一个 3d mxnxt 矩阵,我希望能够提取 t 2d nxm 矩阵。在我的例子中,我有一个 1024x1024x10 矩阵,我想要 10 张图像显示给我。 这不是 reshape ,我每次只需要
我在 MATLAB 中有一个 3d 矩阵 (n-by-m-by-t) 表示一段时间内网格中的 n-by-m 测量值.我想要一个二维矩阵,其中空间信息消失了,只剩下 n*m 随着时间 t 的测量值(即:
作为一个简化的示例,我有一个 3D numpy 矩阵,如下所示: a = np.array([[[1,2], [4,np.nan], [7,
作为一个简化的示例,我有一个 3D numpy 矩阵,如下所示: a = np.array([[[1,2], [4,np.nan], [7,
使用 eigen2 , 并给定一个矩阵 A a_0_0, a_0_1, a_0_2, ... a_1_0, a_1_0, a_1_2, ... ... 和一个矩阵B: b_0_0, b_0_1, b_
我想知道如何获得下面的布局。 在中型和大型设备上,我希望有 2 行和 2 列的布局(2 x 2 矩阵)。 在小型(和超小型)设备上或调整为小型设备时,我想要一个 4 行和 1 列的矩阵。 我将通过 a
有什么方法可以向量化以下内容: for i = 1:6 te = k(:,:,:,i).*(c(i)); end 我正在尝试将 4D 矩阵 k 乘以向量 c,方法是将其
如何从填充有 1 和 0 的矩阵中抽取 n 个随机点的样本? a=rep(0:1,5) b=rep(0,10) c=rep(1,10) dataset=matrix(cbind(a,b,c),nrow
我正在尝试创建一个包含 X 个 X 的矩阵。以下代码生成从左上角到右下角的 X 对 Angular 线,而不是从右上角到左下角的 X 对 Angular 线。我不确定从哪里开始。是否应该使用新变量创建
我想在 python 中创建一个每行三列的矩阵,并能够通过任何一行对它们进行索引。矩阵中的每个值都是唯一的。 据我所知,我可以设置如下矩阵: matrix = [["username", "name"
我有点迷茫 我创建了一个名为 person 的类,它具有 age 和 name 属性(以及 get set 方法)。然后在另一个类中,我想创建一个 persons 数组,其中每个人都有不同的年龄和姓名
我有 n 个类,它们要么堆叠,要么不堆叠。所有这些类都扩展了同一个类 (CellObject)。我知道更多类将添加到此列表中,我想创建一种易于在一个地方操纵“可堆叠性”的方法。 我正在考虑创建一个矩阵
我有一个包含 x 个字符串名称及其关联 ID 的文件。本质上是两列数据。 我想要的是一个格式为 x x x 的相关样式表(将相关数据同时作为 x 轴和 y 轴),但我想要 fuzzywuzzy 库的函
机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需
当我在 julia 中输入这个错误跳转但我不知道为什么,它应该工作。/ julia> A = [1 2 3 4; 5 6 7 8; 1 2 3 4; 5 6 7 8] 4×4 Array{Int64,
我是一名优秀的程序员,十分优秀!