24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 1503  |  回复: 19

lixy1217

木虫 (著名写手)

引用回帖:
10楼: Originally posted by dk1013 at 2015-09-17 11:05:22
很好奇楼主是什么样的问题必须得用10维数组。

偏微分方程计算中,出现10个变量的函数并不奇怪
偶尔敞开心扉,世界将不再孤独
11楼2015-09-18 08:59:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wshwujian

银虫 (初入文坛)


小木虫: 金币+0.5, 给个红包,谢谢回帖
声明10维数组的指针,怎么会加10个*呢?
四维数组:int a[4][2][3][4],该数组的指针声明为:int (*p)[2][3][4];无论是直接使用,还是函数传参。p和数组名是一样的。使用p[j][k][l][m]与*(*(*(*(P+j)+k)+l)+m)是一样的。都是通过地址访问数组啊。。
如果声明的上述自动存储变量的话,动态内存内配。也是一样的。new返回的也是指针类型;
如:int(*p)[2][3][4]=new int[4][2][3][4];
12楼2016-02-08 21:16:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

virtualzx

木虫 (著名写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
如果自定义类就不该再用星号了,你应该定义一个类,类内部储存一维结构,然后重置[]就可以了。只需要存储每一维的位移量,计算坐标就可以用整数列相乘求和得到,这样需要的操作数就从N^2降到N数量级了;这和你直接用[][][]...的计算量是一样的。当然现实中一般都是等距位移,不需要这么复杂。不过你可能会禁不住诱惑又加上许多其他运算--不过还是忍住为好

发自小木虫IOS客户端
13楼2016-02-08 23:44:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

RainyBlueSky

银虫 (小有名气)

14楼2016-02-13 11:50:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

apsjin

新虫 (小有名气)

15楼2016-02-17 08:58:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
12楼: Originally posted by wshwujian at 2016-02-08 21:16:08
声明10维数组的指针,怎么会加10个*呢?
四维数组:int a,该数组的指针声明为:int (*p);无论是直接使用,还是函数传参。p和数组名是一样的。使用p与*(*(*(*(P+j)+k)+l)+m)是一样的。都是通过地址访问数组啊 ...

这种定义范式太限制了吧?
因为后面的2、3、4都要求是固定数值
偶尔敞开心扉,世界将不再孤独
16楼2016-02-17 10:41:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

几罗星人

新虫 (初入文坛)

★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
lixy1217: 金币+1, 谢谢参与~ 2016-02-24 12:00:45
动态高维数组可以用一位数组去模拟,就是动态分配足够大的一维数组,然后在上面模拟高维数组。就是你最后提出来的想法。
定义了数组:
        T MDA[P][Q][R][S][T]……[Y][Z]
访问MDA[a][c][d]……[j][k]即取得其指针,由于数组在内存上是连续储存的,计算指针偏移即可。计算指针偏移的算法为:
        &MDA[a][c][d]……[j][k]
          == &MDA[0][0][0][0]……[0][0] +
                (a*Q*R*S*T*……*Y*Z +
                   b    *R*S*T*……*Y*Z +
                   c        *S*T*……*Y*Z +
                   d           *T*……*Y*Z +
                   …… +
                   j                          *Z +
                   k
                )

           == &MDA[0][0][0][0]……[0][0] +
                ((((a*Q + b)*R+ c)*S+d)*T+ …… )……

而&MDA[0][0][0][0]……[0][0]正是一维数组的起始地址。下面的第二种算式从算法的角度来说可能更优一些, 少了很多乘法。不过代码不好写,而且如果我直接写下面的这种,估计看不懂规律。还是要看上面的那种。类型T是一个抽象的类型,而上式计算的指针偏移是按照类型T去算的,而不是字节,也就是中间的“+”号,每加一次,指针都是向后移动sizeof(T)个字节。

这样的模拟要增加多少运算量,如果封装成类,其他的操作都是常数时间,只有这计算地址偏移是随着维数越高而增长的。要算这个的时间复杂度的话,设维数为n,以乘法作为主要运算,则上面的是n+(n-1)+(n-2)+……+1,即O(n^2);下面的是O(n)。

上传一个我自己写的封装。类MDArray是一个高维数组,可以在构造函数中指定维数,然后变参的构造函数收取相应个数的int数值作为每一维的大小。通过MDArray.Element(下标1,下标2……)的方式访问某一个元素。只是这样有两个不好:1.改变了MDArray[][][]……的访问方式。2.必须自己保证传入的参数个数正确,否则就栈错误了。

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : MultiDimenArray.h
  • 2016-02-24 01:08:09, 7.43 K
17楼2016-02-24 01:16:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
17楼: Originally posted by 几罗星人 at 2016-02-24 01:16:12
动态高维数组可以用一位数组去模拟,就是动态分配足够大的一维数组,然后在上面模拟高维数组。就是你最后提出来的想法。
定义了数组:
        T MDA……
访问MDA……即取得其指针,由于数组在内存上是连续储存的 ...

这种方法的一个缺陷就是访问一个元素还得算好多次乘法,效率堪忧。
偶尔敞开心扉,世界将不再孤独
18楼2016-02-24 12:02:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

43fd6ys

木虫 (正式写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
好好编程,只用一维数组,放弃高维数组.
19楼2016-02-24 20:07:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

几罗星人

新虫 (初入文坛)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
18楼: Originally posted by lixy1217 at 2016-02-24 12:02:58
这种方法的一个缺陷就是访问一个元素还得算好多次乘法,效率堪忧。...

虽说如此,但是使用下面的一种算法,可以有效减少乘法的数量。如果直接使用高维数组,计算的过程是由编译器完成的,这倒好办多了。但是如果允许动态创建指定维数的话,这些就只能被动态计算。这就是为什么C++不允许动态指定高维数组的所有维数,只能指定最后一维的原因。否则对数组的访问代码都没办法在编译期计算偏移。
20楼2016-02-24 21:56:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lixy1217 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 301求调剂 +3 细胞相关蛋白 2026-04-02 5/250 2026-04-02 14:44 by 细胞相关蛋白
[考研] 071000生物学调剂 +4 知昭蔓 2026-04-02 4/200 2026-04-02 14:22 by plum
[考研] 296材料专硕求调剂 +9 202451007219 2026-04-02 10/500 2026-04-02 11:54 by ms629
[考研] 324求调剂 +5 想上学求调 2026-04-01 6/300 2026-04-02 10:16 by sanrepian
[考研] 085600,材料与化工321分调剂 +8 大馋小子 2026-03-27 10/500 2026-04-02 10:15 by kaiyanjie
[考研] 一志愿厦门大学化学工程(专硕)-数二英二406分-求调剂 +5 厦大化工 2026-04-01 5/250 2026-04-02 10:03 by jp9609
[考研] 08工科275分求调剂 +13 AaAa7420 2026-03-31 13/650 2026-04-02 06:19 by 286640313
[考研] 江苏科技大学招材料研究生 +4 Su032713. 2026-04-01 5/250 2026-04-01 22:03 by cccchenso
[考研] 275求调剂 +12 waltzh 2026-04-01 12/600 2026-04-01 21:44 by chyhaha
[考研] 307分求调剂 +14 (o~o) 2026-03-31 15/750 2026-04-01 20:43 by longlotian
[考研] 350求调剂 +7 阿佳~ 2026-03-31 7/350 2026-04-01 16:12 by yanflower7133
[考研] 0703求调剂 +4 zizimo 2026-03-31 4/200 2026-04-01 16:04 by yanflower7133
[考研] 339求调剂 +5 zjjkt 2026-03-31 5/250 2026-04-01 09:18 by JourneyLucky
[考研] 070300化学专业279调剂 +10 哈哈哈^_^ 2026-03-31 10/500 2026-03-31 23:13 by liu823948201
[考研] 复试调剂 +7 双马尾痞老板2 2026-03-31 7/350 2026-03-31 19:49 by Dyhoer
[考研] 求调剂 生物学 377分 +6 zzll03 2026-03-31 6/300 2026-03-31 17:33 by 唐沐儿
[考研] 353求调剂 +3 江上枫_26 2026-03-28 3/150 2026-03-31 15:53 by jp9609
[考研] 一志愿哈尔滨工业大学材料与化工方向336分 +13 辰沐5211314 2026-03-26 13/650 2026-03-31 14:37 by 记事本2026
[考研] 本科211安全工程,初试290分,求调剂 +3 2719846834 2026-03-28 3/150 2026-03-31 13:52 by 热情沙漠
[硕博家园] 招收生物学/细胞生物学调剂 +4 IceGuo 2026-03-26 5/250 2026-03-29 01:25 by griffith2014
信息提示
请填处理意见