在不同大小的方阵上进行了一些实验后,一个模式出现了。对大小为2^n
的矩阵进行转置总是比对大小为2^n+1
的矩阵进行转置慢。对于n
的小值,差异不大。
但是,如果值为512,则会出现很大的差异。(至少对我来说)
免责声明:我知道函数实际上并没有转置矩阵,因为元素的双重交换,但这没有区别。
#define SAMPLES 1000
#define MATSIZE 512
#include <time.h>
#include <iostream>
int mat[MATSIZE][MATSIZE];
void transpose()
{
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
{
int aux = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = aux;
}
}
int main()
{
//initialize matrix
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
mat[i][j] = i+j;
int t = clock();
for ( int i = 0 ; i < SAMPLES ; i++ )
transpose();
int elapsed = clock() - t;
std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES;
}
这一解释来源于Agner Fog在C++中优化软件的过程,并归结为数据是如何被访问和存储在缓存中的。
有关术语和详细信息,请参阅wiki中关于缓存的条目,我将在这里对其进行缩小。
缓存是按集合和行组织的。每次只使用一个集合,其中包含的任何行都可以使用。一行可以镜像的内存乘以行数给出了高速缓存的大小。
set = ( address / lineSize ) % numberOfsets
criticalStride = numberOfSets * lineSize
这是理论部分。接下来的解释(也是Agner,我在紧跟它以免出错):
假设一个64x64的矩阵(记住,效果根据缓存的不同而不同),缓存为8KB,每组4行*行大小为64字节。每行可以容纳矩阵中的8个元素(64位int
)。
临界步幅为2048字节,对应于矩阵的4行(在内存中是连续的)。
C++:15秒(源) Python:6分13秒(来源) C++:45分钟(源) 蟒蛇:10小时后被杀死(来源) 为什么Strassen矩阵乘法比标准矩阵乘法慢得多? null null null
问题内容: 我正在自学一些Java,并且坚持创建2D数组,该数组使用随机值对其进行初始化,然后创建该数组的转置。 示例输出为: 原始矩阵 转置矩阵 ^应该是最终输出。代码的一些帮助将不胜感激! 如果行或列的数量超出指定范围,我想编写代码以生成错误消息。以及是否从命令行读取矩阵元素而不是随机生成它们。 问题答案: 这是返回转置矩阵的int [] []的简单方法… 比起打印二维矩阵,您可以使用如下方法
问题内容: 我正在尝试为python创建矩阵转置函数,但似乎无法使其工作。说我有 我想提出我的职能 因此,换句话说,如果我要将此2D数组打印为列和行,我希望将行变成列,将列变成行。 我到目前为止已经做到了,但是没有用 问题答案: Python 2: Python 3:
矩阵(包括稀疏矩阵)的转置,即互换矩阵中所有元素的行标和列标,如图 1 所示: 图 1 矩阵转置示意图 但如果想通过程序实现矩阵的转置,互换行标和列标只是第一步。因为实现矩阵转置的前提是将矩阵存储起来, 数据结构中提供了 3 种存储矩阵的结构,分别是三元组 顺序表、行逻辑链接的顺序表和十字 链表。如果采用前两种结构,矩阵的转置过程会涉及三元组表也跟着改变的问题,如图 2 所示: 图 2 三元组表的
问题内容: 如何获得此矩阵的转置。任何更简单的算法都可以执行此操作… 第一个问题: 第二个问题: Zip给我下面的输出如下,当我不知道数组中有多少个元素时,我如何压缩,在这种情况下,我知道3个元素a [0],a [1],a [2],但是如何我压缩一个[n]个元素 问题答案: 问题答案: 感谢AFG的帮助
我正在看一看大型矩阵乘法,并运行以下实验以形成一个基线测试: null 以下是Octave/MATLAB实现: 运行: hood下的Octave正在使用BLAS(我假设函数) 有人能解释这种差别吗?BLAS实现的体系结构到底是什么?我看到它在使用Fortran,但是在CPU级别上发生了什么呢?它用的是什么算法?它是如何使用CPU缓存的?它调用什么x86-64机器指令?(是使用AVX这样的高级CPU