"FixedArray" (数据结构)
"FixedArray"
表示一个固定长度的数组,其中的元素是普通表达式.
更多信息
- 固定长度的数组可用于有效地提取和更新元素:
-
CreateDataStructure[ "FixedArray",n] 创建新的有 n 个元素的空 "FixedArray" CreateDataStructure[ "FixedArray",x,n] 创建一个长度为 n 的新 "FixedArray",初始化为 x CreateDataStructure[ "FixedArray",elems] 创建一个包含 elems 的新 "FixedArray" Typed[x,"FixedArray"] 指定 x 的类型为 "FixedArray" - 对于类型为 "FixedArray" 的数据结构,可进行以下操作:
-
ds["Copy"] 返回 ds 的副本 时间: O(n) ds["Elements"] 返回 ds 的参数列表 时间: O(n) ds["EmptyQ"] 如果 ds 中没有元素则返回 True 时间: O(1) ds["Fold",fun] 将 fun 应用于 ds 的元素,并累计结果 时间:O(n) ds["Fold",fun,init] 将 fun 应用于 ds 的以 init 开始的元素,并累计结果 时间:O(n) ds["Length"] 存储在 ds 中的元素的数量 时间: O(1) ds["Part",i] 给出 ds 中的第 i
个元素时间: O(1) ds["SetPart",i,elem] 更新 ds 的第 i
个元素时间: O(1) ds["SwapPart",i,j] 将 ds 的第 i
个元素和第 j
个元素互换时间: O(1) ds["Visualization"] 返回 ds 的可视化 时间: O(n) - 还支持以下函数:
-
dsi===dsj 如果 dsi 等于 dsj 则为 True ds["Part",i]=val 将 ds 的第 i
个元素设为 valFullForm[ds] ds 的完全形式 Information[ds] 关于 ds 的信息 InputForm[ds] ds 的输入形式 Length[ds] ds 中的元素个数 Normal[ds] 将 ds 转换成普通表达式
范例
打开所有单元 关闭所有单元基本范例 (2)
可用 CreateDataStructure 创建新的 "FixedArray":
ds = CreateDataStructure["FixedArray", 8]ds["Length"]这些元素被初始化为 Null:
ds["Elements"]ds["Part", 1] = f[2]ds["Part", 1]Normal[ds]ds = CreateDataStructure["FixedArray", 1000];
Do[ds["SetPart", i, i], {i, 1000}]ds["Visualization"]ds["Fold", Plus]范围 (13)
创建 (3)
创建一个包含 12 个元素的 "FixedArray":
ds = CreateDataStructure["FixedArray", 12]默认情况下,所有元素都初始化为 Null:
ds["Elements"]创建一个包含 12 个元素并指定默认初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", -1, 12]ds["Elements"]用一个数组的内容初始化 "FixedArray":
ds = CreateDataStructure["FixedArray", {x, y, z}]ds["Elements"]信息 (1)
可用 CreateDataStructure 创建新的 "FixedArray":
ds = CreateDataStructure["FixedArray", 8]Information[ds]操作 (9)
"Copy" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", {1, 2, 3}]ds1 = ds["Copy"]{Normal[ds], Normal[ds1]}ds1["SetPart", 2, 42];
{Normal[ds], Normal[ds1]}"Elements" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]];
ds["Visualization"]ds["Elements"]Normal 返回相同的列表:
Normal[ds]"EmptyQ" (1)
测试 "FixedArray" 是否为空:
ds = CreateDataStructure["FixedArray", 0];
ds["EmptyQ"]"Fold" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]]使用 Plus 组合数组的所有元素,产生它们的总和:
ds["Fold", Plus]ds["Fold", Plus, 42]"Length" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[5]]ds["Length"]Length 函数给出相同的值:
Length[ds]"Part" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]]ds["Part", 5]"SetPart" (1)
创建一个带有初始值的"FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]]ds["SetPart", 5, x]ds["Visualization"]ds["Part", 6] = y;
ds["Visualization"]"SwapPart" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]]ds["SwapPart", 5, 6]ds["Visualization"]"Visualization" (1)
创建一个带有初始值的 "FixedArray":
ds = CreateDataStructure["FixedArray", Range[10]]ds["Visualization"]属性和关系 (1)
滑动窗口计算 (1)
使用 "FixedArray" 维护流数据上的滑动窗口:
buffer = CreateDataStructure["FixedArray", ConstantArray[0, 5]]push[array : DataStructure["FixedArray", _], x_] :=
With[{len = Length[array]},
Do[array["SetPart", i, array["Part", i + 1]], {i, 1, len - 1}];
array["SetPart", len, x]
]Scan[push[buffer, #]&, Range[8]];
buffer["Elements"]属性和关系 (5)
InputForm (1)
InputForm 返回 "FixedArray" 的序列化内容:
InputForm[CreateDataStructure["FixedArray", Range[10]]]DataStructure["FixedArray", {"Data" -> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}]Length (1)
可以使用 Length 获取 "FixedArray" 中的元素数量:
ds = CreateDataStructure["FixedArray", Range[10]];
Length[ds]ds["Length"]Normal (1)
Normal 可用于获取 "FixedArray" 的元素:
ds = CreateDataStructure["FixedArray", Range[10]];
Normal[ds]ds["Elements"]SameQ (1)
SameQ 可用于测试两个数组是否包含相同顺序的相同元素:
ds1 = CreateDataStructure["FixedArray", Range[10]];
ds2 = CreateDataStructure["FixedArray", Range[10]];
ds1 === ds2ds1["SetPart", 5, 42];
ds1 === ds2"DynamicArray" (1)
许多适用于 "DynamicArray" 的算法也同样适用于 "FixedArray".
与 "DynamicArray" 不同,"FixedArray" 的大小无法修改.
可能存在的问题 (2)
互动范例 (1)
计算并保存数据结构中的个别绘图,然后使用 Manipulate 交互式显示这些绘图:
ds = CreateDataStructure["FixedArray", 16]Do[ds["SetPart", i, Plot[Sin[i x] / x, {x, 0, 10}, Filling -> Axis, PlotRange -> 1]], {i, ds["Length"]}]Manipulate[ds["Part", i], {i, 1, ds["Length"], 1}]巧妙范例 (2)
斐波那契 (1)
ds = CreateDataStructure["FixedArray", 16]ds["SetPart", 1, 1];
ds["SetPart", 2, 1];
Do[ds["SetPart", i, ds["Part", i - 2] + ds["Part", i - 1]], {i, 3, ds["Length"]}]ds["Visualization"]直方图 (1)
redBin = CreateDataStructure["FixedArray", ConstantArray[0, 256]];
greenBin = CreateDataStructure["FixedArray", ConstantArray[0, 256]];
blueBin = CreateDataStructure["FixedArray", ConstantArray[0, 256]];
indexOf[x_] := Floor[255 x] + 1
computeHistogram[{r_, g_, b_}] :=
Module[{},
redBin["SetPart", indexOf[r], redBin["Part", indexOf[r]] + 1];
greenBin["SetPart", indexOf[b], greenBin["Part", indexOf[b]] + 1];
blueBin["SetPart", indexOf[g], blueBin["Part", indexOf[g]] + 1];
]ImageScan[computeHistogram, [image]]BarChart[Transpose[Normal /@ {redBin, greenBin, blueBin}], PlotRange -> All, ChartStyle -> {Red, Green, Blue}, BarSpacing -> None]历史
2020年引入 (12.1)