回 帖 发 新 帖 刷新版面

主题:怎样开辟一个二维数组能让其每行长度可任意缩放呢?

要开辟一个二维数组,但是在计算过程中需要不断改变其每行的长度,该如何实现呢?

回复列表 (共29个回复)

21 楼

打开SIMD优化就可以了,数据复制浪费的时间比你计算的时间少多了:)
另:
B与C是大数组
A只是需要存放当前计算的矩阵的小数组:)

22 楼

[quote]打开SIMD优化就可以了,数据复制浪费的时间比你计算的时间少多了:)
另:
B与C是大数组
A只是需要存放当前计算的矩阵的小数组:)[/quote]
由于每个子矩阵的大小不断变化,因此大矩阵B的尺寸也是变化的啊。
也就是说C和B都是由一系列尺寸变化的子矩阵拼成的。
您这样做是否相当于每次都把所有数据放到另外一个临时存储空间,然后deallocate再重新allocate,通过这样来实现改变数组大小的目的呢?

23 楼

可以这么说:)

24 楼

[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 楼

[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 楼

如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)

27 楼

[quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。

28 楼

[quote][quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。[/quote]
预留实际大小的0.3吧,
另:这是模拟文件系统,在实际操作中可能还会有其余问题需要解决。
比如:
你需要做一个特别的功能,叫:碎片整理,当块空间已无法申请到连续空间时,调用一下:)

29 楼

[quote][quote][quote]如果每个小矩阵的计算顺序不定,那可以这样:
建立一个位置索引数组,如果数组计算后变小,就放在原地,如果变大且放不下则放到数组后面。
数组需要预留一定的空间。且分配空间时按块分配(比如1K为一个块)[/quote]
谢谢!这个方法容易明白呵呵~
但是“预留的空间”很难定,除非开到最大,但是这样又太浪费内存。
而且如果变大时放到数组的后面,这样索引起来很麻烦啊。[/quote]
预留实际大小的0.3吧,
另:这是模拟文件系统,在实际操作中可能还会有其余问题需要解决。
比如:
你需要做一个特别的功能,叫:碎片整理,当块空间已无法申请到连续空间时,调用一下:)[/quote]
谢谢您!我试下~

我来回复

您尚未登录,请登录后再回复。点此登录或注册