ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1117|回复: 9

[求助] 有偿求助!!!vba做数据分析,计算两个4149*4149数组相乘,跑了很久没跑出来,见下述

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-5 20:29 | 显示全部楼层 |阅读模式
      我做的是一个pls分析(就是一种数据分析),其中我用的是自己写的矩阵乘法运算,加了一点优化在里面(对含很多0元素才有效果),里面的各种函数都是自己编写的(如jian(x(),y())函数是两个数组对应元素相减),但都是用循环实现的。调试过程中,我发现有一步要计算两个4149*4149数组相乘(图中我标断点处,主过程名为test,调用pls函数,pls中调用了我自己编写的矩阵运算函数),pls函数中第一次循环时由于第一个矩阵chg是单位矩阵,我的优化有点效果(我猜的),我调试到第二次时chg不再是单位矩阵了,这下就是复杂度O(n^3)的矩阵相乘运算了,直接跑不出来了,请指教。(也尝试了内置函数mmult,同样跑死。)
我自己考虑了一些问题,但我是第一次使用vba,所以对这些也不清楚,只是感觉会影响到运行速度,不知道值不值得去改:
1、我定义的数组都没有指定类型(原因是我从单元格拉数据进我定义的single或者定义的double数组时报错类型不匹配)
2、 计算过程我用了很多中间变量,因为这些函数是自己写的,如果直接嵌套写会报错如a = mult(x,trans(y))(mult和trans都是我自己写的,因为在网上看到内置的函数如转置在数组维度很大时会出错,我尝试了一下的确转不了,后面就都自己写了)

希望能教我解决一下这个矩阵相乘跑死的问题,我所考虑的问题不知道对整个程序运行减少时间有没有帮助,目前整个程序的运行速度也比较慢,如能帮助解决有偿!!!!由于文件超过2M,无法附件上传,劳烦在百度云上下载一下。
链接:https://pan.baidu.com/s/1GQx2bEmf6VH7EL-oTho7kA
提取码:tz28
image.png

我上传的文件中pls里大循环只有一次,第二次循环时计算量很大跑死,我要解决的问题最多可能跑到10几次循环

image.png


TA的精华主题

TA的得分主题

发表于 2019-12-6 14:42 | 显示全部楼层
看的瑟瑟发抖,你这其他语言转换来的吧?

TA的精华主题

TA的得分主题

发表于 2019-12-8 17:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-8 22:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
约定的童话 发表于 2019-12-6 14:42
看的瑟瑟发抖,你这其他语言转换来的吧?

嗯,matlab先写

TA的精华主题

TA的得分主题

发表于 2019-12-9 09:33 | 显示全部楼层

要优化的地方太多,比如下面这个函数,简单处理一下,就不知道快多少了
  1. Function eye(n)
  2.     ReDim earr(1 To n, 1 To n) As Double 'As Double
  3.     Dim i As Integer
  4.     For i = 1 To n
  5.         earr(i, i) = 1
  6.      Next
  7.     eye = earr
  8. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-10 11:28 | 显示全部楼层
lsdongjh 发表于 2019-12-9 09:33
要优化的地方太多,比如下面这个函数,简单处理一下,就不知道快多少了

您好,谢谢您回复。我一开始是这样您这样写的,指定数组类型double后默认为0值。
但是外面调用时是这样:
dim chg()

chg = eye(n)
如果指定了数据类型会报错,类型不匹配,也就是我提问中,我自己考虑的问题里第一点:
1、我定义的数组没有指定类型(原因是我从单元格拉数据进来时提示数据类型不匹配)
不知道您觉得有哪些地方可以改进

TA的精华主题

TA的得分主题

发表于 2019-12-10 11:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
从单元格中,用Variant 类型导入时,先进行转换,后续所有的传参、入参都指定类型!

TA的精华主题

TA的得分主题

发表于 2019-12-10 11:38 | 显示全部楼层
  1. '数组转为Double, 也可行列转换
  2. Function TransArrToDouble(arr As Variant, Optional blIsTrans As Boolean = True) As Double()
  3.     Dim lngR As Long, lngC As Long
  4.     Dim dblTemp() As Double

  5.     If blIsTrans Then
  6.         ReDim dblTemp(LBound(arr, 2) To UBound(arr, 2), LBound(arr) To UBound(arr)) As Double
  7.         For lngR = LBound(arr) To UBound(arr)
  8.             For lngC = LBound(arr, 2) To UBound(arr, 2)
  9.                 dblTemp(lngC, lngR) = Val(arr(lngR, lngC))
  10.             Next
  11.         Next
  12.     Else
  13.         ReDim dblTemp(LBound(arr) To UBound(arr), LBound(arr, 2) To UBound(arr, 2)) As Double
  14.         For lngR = LBound(arr) To UBound(arr)
  15.             For lngC = LBound(arr, 2) To UBound(arr, 2)
  16.                 dblTemp(lngR, lngC) = Val(arr(lngR, lngC))
  17.             Next
  18.         Next
  19.     End If

  20.     TransArrToDouble = dblTemp
  21. End Function
复制代码


  1. 'w到w*变换矩阵的初始化
  2. Function EYE(lngCount As Long) As Double()
  3.     Dim dblArr() As Double, lngID As Long

  4.     ReDim dblArr(1 To lngCount, 1 To lngCount) As Double

  5.     For lngID = 1 To lngCount
  6.         dblArr(lngID, lngID) = 1
  7.     Next

  8.     EYE = dblArr
  9. End Function
复制代码

  1.     arrTemp = sh.Range("A1").Resize(lngSample, lngCountInd)
  2.     varIndependent_Old = TransArrToDouble(arrTemp, False)
  3.     varIndependent_New = TransArrToDouble(arrTemp)
复制代码

  1.     Dim dblChg() As Double   
  2.     dblChg = EYE(4149) 'w到w*变换矩阵的初始化
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-10 12:06 | 显示全部楼层

十分感谢,我刚刚尝试了一下,的确我看有的教程上说指定类型会比用variant类型快,我打算后期优化时对这个方面进行改进。方便的话可以加我微信 17718151693(注明一下)。您的代码规范性十足

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-10 12:10 | 显示全部楼层

十分感谢,我刚刚尝试了一下,的确我看有的教程上说指定类型会比用variant类型快,我打算后期优化时对这个方面进行改进。方便的话可以加我微信 17718151693。您的代码规范性十足
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 11:16 , Processed in 0.047482 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表