c++ - 如何将 M 维数组转换为 N 维数组?
问题描述
受启发arr2D[i][j]
并arr1D[i * k + j]
在阅读了这篇文章及其下的评论之后,我想知道一种可以改变任何数组维度的算法。
让我尝试将其形式化:
输入:
一
M
维容器A
容器尺寸
D
(大小)目标维度
N
输出:
如果then 返回与 order内容相同N > 0
的 N 维容器,则返回错误代码。B
A
笔记:
您可以为 N 维容器选择任何最佳尺寸。
编辑:
我不需要任何完全可用的代码。我在问是否有任何算法可以做到这一点?
解决方案
因此,您只想在不更改数据的情况下重新格式化矩阵。正如我在评论中暗示的那样,最简单的方法是使用一维数组中间步骤将 M 维转换为 N 维。
这里的其他答案在同一轨道上,但缺乏整个数学......他们只有一些小维度的例子,没有通用方程,所以这里是:
要在容器的尺寸大小(分辨率)之间A[A0][A1]...[A(M-1)]
和X[A0*A1*...*A(M-1)]
位置之间进行转换,只需执行以下操作:A0,A1,...A(M-1)
// M-D -> 1D
x = a0
+a1*A0
+a2*A0*A1
...
+a(M-1)*A0*A1*...*A(M-2);
// 1D -> M-D
q=x;
a0 = q%A0; q/=A0;
a1 = q%A1; q/=A1;
a2 = q%A2; q/=A2;
...
a(M-1) = q%A(M-1); q/=A(M-1);
wherea0,a1,...a(M-1)
和x
是数组中的索引。
实际上,您不需要将 MD 数组转换为 1D 数组,然后再返回 ND 就足以将索引转换为:
for (a0=0;a0<A0;a0++)
for (a1=0;a1<A1;a1++)
...
for (a(M-1)=0;a(M-1)<A(M-1);a(M-1)++)
{
// M-D -> 1D
x = a0
+a1*A0
+a2*A0*A1
...
+a(M-1)*A0*A1*...*A(M-2);
// 1D -> N-D
q=x;
b0 = q%B0; q/=B0;
b1 = q%B1; q/=B1;
b2 = q%B2; q/=B2;
...
b(N-1) = q%B(N-1); q/=B(N-1);
// copy A -> B
B[b0][b1]...[b(N-1)] = A[A0][A1]...[A(M-1)];
}
不要忘记尺寸必须是:
A0*A1*...*A(M-1) <= B0*B1*...*B(N-1)
否则您将访问数组超出其范围,因为其中的数据A
不适合B
.
如果你有动态维度,你可以使用:
推荐阅读
- highcharts - 带有向下钻取的嵌套柱形图
- asp.net - 如果长度大于 1,则无法读取 cookie
- vue.js - 如何访问 vuex 存储模块中的嵌套操作?
- fortran - GNU Fortran / OpenMP 程序如何设置和检索 stacksize-var ICV?
- contacts - 在没有现有地址的联系人中如何设置地址
- accessibility - 有关 PCI(支付卡行业)合规性的安全/托管字段的 WCAG 指南
- azure-devops - 在托管池中找不到满足指定要求的代理
- java - 如何在 Android SeekBar 中去除 Thumb 周围的气泡?
- sql - 在给定条件 SQL 的情况下查找国家
- javascript - 令人惊讶的实例化模式 - 包装函数上使用的新关键字