主题:怎样开辟一个二维数组能让其每行长度可任意缩放呢?
timwan
[专家分:0] 发布于 2010-06-04 15:36:00
要开辟一个二维数组,但是在计算过程中需要不断改变其每行的长度,该如何实现呢?
回复列表 (共29个回复)
21 楼
cgl_lgs [专家分:21040] 发布于 2010-07-16 10:41:00
打开SIMD优化就可以了,数据复制浪费的时间比你计算的时间少多了:)
另:
B与C是大数组
A只是需要存放当前计算的矩阵的小数组:)
22 楼
timwan [专家分:0] 发布于 2010-07-16 12:04:00
[quote]打开SIMD优化就可以了,数据复制浪费的时间比你计算的时间少多了:)
另:
B与C是大数组
A只是需要存放当前计算的矩阵的小数组:)[/quote]
由于每个子矩阵的大小不断变化,因此大矩阵B的尺寸也是变化的啊。
也就是说C和B都是由一系列尺寸变化的子矩阵拼成的。
您这样做是否相当于每次都把所有数据放到另外一个临时存储空间,然后deallocate再重新allocate,通过这样来实现改变数组大小的目的呢?
23 楼
cgl_lgs [专家分:21040] 发布于 2010-07-16 16:02:00
可以这么说:)
24 楼
cgl_lgs [专家分:21040] 发布于 2010-07-19 10:55:00
[quote]那再试试此法呢:)
1:将原始子矩阵都放到C数组里;
2:计算时放到A数组中;
3:计算结果放到B里;
所有矩阵计算完毕后再把B数组数据全给C;
回到2:直到完成迭代:)[/quote]
再给你一个方法,比这方法更省时,只是复杂点儿:
1:将原始子矩阵都放到C数组里;
2:迭代开始;
3:计算时从C放到A数组中;
4:计算结果放到B里;
5:检查是否完成迭代是则到9;
6:计算时从B放到A数组中;
7:计算结果放到C里;
8:检查是否完成迭代是则到9,否则到2;
9:完成并进行后处理:)
25 楼
timwan [专家分:0] 发布于 2010-07-19 15:23:00
[quote]再给你一个方法,比这方法更省时,只是复杂点儿:
1:将原始子矩阵都放到C数组里;
2:迭代开始;
3:计算时从C放到A数组中;
4:计算结果放到B里;
5:检查是否完成迭代是则到9;
6:计算时从B放到A数组中;
7:计算结果放到C里;
8:检查是否完成迭代是则到9,否则到2;
9:完成并进行后处理:)
[/quote]
谢谢。
这样出来的最后结果也是放在C里,但是按照我的算法最后数组和C是不一样大小的啊,因为C的每个子矩阵大小都在变啊。并不是保持总大小不变仅改变分块方式。
26 楼
cgl_lgs [专家分:21040] 发布于 2010-07-20 10:27:00
如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)
27 楼
timwan [专家分:0] 发布于 2010-07-20 22:15:00
[quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。
28 楼
cgl_lgs [专家分:21040] 发布于 2010-07-20 23:42:00
[quote][quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。[/quote]
预留实际大小的0.3吧,
另:这是模拟文件系统,在实际操作中可能还会有其余问题需要解决。
比如:
你需要做一个特别的功能,叫:碎片整理,当块空间已无法申请到连续空间时,调用一下:)
29 楼
timwan [专家分:0] 发布于 2010-07-22 23:15:00
[quote][quote][quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。[/quote]
预留实际大小的0.3吧,
另:这是模拟文件系统,在实际操作中可能还会有其余问题需要解决。
比如:
你需要做一个特别的功能,叫:碎片整理,当块空间已无法申请到连续空间时,调用一下:)[/quote]
谢谢您!我试下~
我来回复