24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1403  |  回复: 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 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见