- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 N 个大小相同的 MxM 方阵,它们必须复制到一个包含 NxN 矩阵的矩阵中,并以对称方式排列。上半部分和下半部分包含与此方案相同的矩阵的转置版本。
N = 4
m1 m2 m3 m4
m2'm1 m2 m3
m3'm2'm1 m2
m4'm3'm2'm1
生成数据的算法最初只填充上面的行和第一列,其余为空。
m1 m2 m3 m4
m2'0 0 0
m3'0 0 0
m4'0 0 0
我想找到一个有效的索引方案来填充所有大矩阵,从已经填充的行的元素开始。请记住,m1...mn 是大小为 MxM 的方阵,矩阵按列优先顺序排列。矩阵不是很大,因此无需利用太多局部性和缓存相关的东西。
简单的算法如下所示,其中 X 是矩阵。
int toX = 0, fromX = 0, toY = 0, fromY = 0;
for (int i = 1; i < N; ++i) {
for (int j = 1; j < N; ++j) {
for (int ii = 0; ii < M; ++ii) {
for (int jj = 0; jj < M; ++jj) {
fromX = (i - 1) * dim + ii;
fromY = (j - 1) * dim + jj;
toX = i * dim + ii;
toY = j * dim + jj;
X(toX, toY) = X(fromX, fromY);
}
}
}
}
你能找到更好的方法吗?
最佳答案
根据您的应用程序,可能不需要存储所有这些转置矩阵。如果 m1 是对称的,您甚至可以剔除 m1 矩阵的下半部分。
事实上,甚至可以不理会所有这些矩阵,而是逐 block 进行矩阵运算(标量的加法和乘法很简单, vector 的乘法会稍微复杂一些)
如果你真的需要整个矩阵,你可能会通过对角线填充矩阵来获得略低的操作数,即通过做这样的事情:
int toX = 0, fromX = 0, toY = 0, fromY = 0;
// m1 (note that this part can be sped up further if m1 is symmetric)
for (int ii = 0; ii<M; ii++){
for (int jj = 0; jj<M; jj++){
fromX = ii;
fromY = jj;
toX = fromX;
toY = fromY;
for (int k=1; k<N; k++){
toX += dim;
toY += dim;
X(toX, toY) = X(fromX, fromY);
}
}
}
// m2 to m(N-1)
for (int i = 2; i < N; i++){
for (int ii = 0; ii<M; ii++){
for (int jj = 0; jj<M; jj++){
fromX = i*dim+ii;
fromY = jj;
toX = fromX;
toY = fromY;
for (int k=i; k<N; k++){
toX += dim;
toY += dim;
X(toX, toY) = X(fromX, fromY);
X(toY, toX) = X(fromX, fromY);
}
}
}
}
关于c++ - 在大矩阵中复制图 block 的高效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028053/
我在使用 Swift 2.0 编写的应用程序上使用 AutoLayout 和代码,并使用 Cartograph 来帮助解决约束。但有些东西阻止了我的应用程序,否则,我用它以编程方式添加 View 。
我必须创建一张 map ,为此我安装了 google cartographer 并使用了 3D 相机,通过它可以获取周围环境的数据。我正在阅读制图师的文档,但我找不到向我解释如何绘制 map 的地方。
我是 Web GIS 制图的新手,我有兴趣了解 WEB GIS 以及需要哪些技能。 我知道 Arcgis Desktop、FME、VBA、Microstation 和 Autocad。 请指导我。 最
我正在处理一个项目,该项目使用 C/C++ 语言在 Visual Studio 2010 中使用箱线图处理数据和显示信息。 我在 MSDN Microsoft documentation 上找到了一些
我是一名优秀的程序员,十分优秀!