ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 任意二维数组矩阵的旋转、转置处理自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-21 16:56 | 显示全部楼层 |阅读模式
在研究 8皇后排列问题时,产生了对结果进行去重复的要求。

即,任一满足条件的结果,需要排除其90度旋转、以及行列转置后产生的镜像对称图形。


于是,扩展到一般的二维矩阵(包括行数、列数不同的矩形矩阵)
对它们进行一共8种不同镜像对称结果的计算。

^_^

请先看附图:
8Type.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-21 17:15 | 显示全部楼层
以下为自定义函数:

附件为使用例子。(也可用于VBA内存数组的转换)
  1. Function JoinTurnArr(Rng_Arr, k&, Optional z& = 0) 'k=4/5,3/6,2/7,1/8
  2.     Dim i&, j&, l1&, l2&, u1&, u2&, r&, s$, t&
  3.     If IsObject(Rng_Arr) Then arr = Rng_Arr.Value Else arr = Rng_Arr
  4.     l1 = LBound(arr): u1 = UBound(arr): l2 = LBound(arr, 2): u2 = UBound(arr, 2)
  5.     If z Then
  6.         s = ""
  7.         If k Mod 2 Then
  8.             For j = l2 To u2
  9.                 For i = l1 To u1
  10.                     r = r + 1
  11.                     If k = 5 Then t = arr(i, j) 'adcb OK
  12.                     If k = 3 Then t = arr(i, u2 - j + l2) 'bcda OK
  13.                     If k = 7 Then t = arr(u1 - i + l1, u2 - j + l2) 'cbad OK
  14.                     If k = 1 Then t = arr(u1 - i + l1, j) 'dabc OK
  15.                     If t Then s = s & "," & r
  16.                 Next
  17.             Next
  18.         Else
  19.             For i = l1 To u1
  20.                 For j = l2 To u2
  21.                     r = r + 1
  22.                     If k = 4 Then t = arr(i, j) 'abcd OK
  23.                     If k = 6 Then t = arr(i, u2 - j + l2) 'badc OK
  24.                     If k = 2 Then t = arr(u1 - i + l1, u2 - j + l2) 'cdab OK
  25.                     If k = 8 Then t = arr(u1 - i + l1, j) 'dcba OK
  26.                     If t Then s = s & "," & r
  27.                 Next
  28.             Next
  29.         End If
  30.         JoinTurnArr = Mid(s, 2)
  31.     Else
  32.         If k = 4 Then JoinTurnArr = arr: Exit Function
  33.         If k Mod 2 Then ReDim trr(l2 To u2, l1 To u1) Else ReDim trr(l1 To u1, l2 To u2)
  34.         For i = l1 To u1
  35.             For j = l2 To u2
  36. '                If k = 4 Then trr(i, j) = arr(i, j) 'abcd OK
  37.                 If k = 5 Then trr(j, i) = arr(i, j) 'adcb OK
  38.                
  39.                 If k = 3 Then trr(u2 - j + l2, i) = arr(i, j) 'bcda OK
  40.                 If k = 6 Then trr(i, u2 - j + l2) = arr(i, j) 'badc OK
  41.                
  42.                 If k = 2 Then trr(u1 - i + l1, u2 - j + l2) = arr(i, j) 'cdab OK
  43.                 If k = 7 Then trr(u2 - j + l2, u1 - i + l1) = arr(i, j) 'cbad OK
  44.                
  45.                 If k = 1 Then trr(j, u1 - i + l1) = arr(i, j) 'dabc OK
  46.                 If k = 8 Then trr(u1 - i + l1, j) = arr(i, j) 'dcba OK
  47.             Next
  48.         Next
  49.         JoinTurnArr = trr
  50.     End If
  51. End Function
复制代码

JoinTurnArr.zip

13.12 KB, 下载次数: 335

TA的精华主题

TA的得分主题

发表于 2014-8-21 22:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川裙子老师厉害呀,学习!

TA的精华主题

TA的得分主题

发表于 2014-8-21 23:44 | 显示全部楼层
香川群子 发表于 2014-8-21 17:15
以下为自定义函数:

附件为使用例子。(也可用于VBA内存数组的转换)

建一个一维表,对照2维表按先行后列赋值为1到MxN,其序号为结果矩阵的位置编号,值为原始矩阵的位置编号。

对不同的转换方式,找出原位置和新位置编号之间的数学关系,直接计算得出。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-22 11:46 | 显示全部楼层
lee1892 发表于 2014-8-21 23:44
建一个一维表,对照2维表按先行后列赋值为1到MxN,其序号为结果矩阵的位置编号,值为原始矩阵的位置编号。 ...

这样计算、比直接双层循环效率更低。

…………

当然,说到效率,我应该把8种情况各自写对应的循环代码,
虽然代码增加很多,但是每次循环都要判断模式k值效率影响很大的。
…………虽然数组元素较少时影响不大。

呵呵。

TA的精华主题

TA的得分主题

发表于 2014-8-22 12:57 | 显示全部楼层
香川群子 发表于 2014-8-22 11:46
这样计算、比直接双层循环效率更低。

…………


双重循环足已,一维循环都能处理
无否是简单的位置关系!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-22 13:40 | 显示全部楼层
jsxjd 发表于 2014-8-22 12:57
双重循环足已,一维循环都能处理
无否是简单的位置关系!

呵呵,任何代码,单独分开来看,也都没有什么了不起……

TA的精华主题

TA的得分主题

发表于 2014-8-22 15:39 | 显示全部楼层
香川群子 发表于 2014-8-22 13:40
呵呵,任何代码,单独分开来看,也都没有什么了不起……

思路、方法、效率还是有优劣的

TA的精华主题

TA的得分主题

发表于 2014-8-22 16:17 | 显示全部楼层
香川群子 发表于 2014-8-22 11:46
这样计算、比直接双层循环效率更低。

…………

哦,那你一定试过了?对比代码放上来看看?

TA的精华主题

TA的得分主题

发表于 2014-8-22 16:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-8-22 11:46
这样计算、比直接双层循环效率更低。

…………

哦,那你一定试过了?对比代码放上来看看?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-16 14:50 , Processed in 0.040206 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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