高阶矩阵转置算法(百万阶的矩阵)
需要从文件读取矩阵,获取行数和列数,并进行转置。可能不是方阵!有没有算法的空间复杂度和时间复杂度比较好的算法啊{:10_266:} 本帖最后由 风扫地 于 2018-11-10 16:19 编辑思路1.先用MATLABtextscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了,我这个主意你觉得怎么样;
思路2.先获得数据的规模,申请空间,读一个然后算对应位置(应该就交换一下下标),存入对应空间。再读一个,再存一个,直到读完,存完。
{:10_277:} 矩阵转置还有考虑是不是方阵的么。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 风扫地 发表于 2018-11-9 12:00
思路1.先用MATLABtextscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了 ...
不能用matlab,老师要求自己用C++写 本帖最后由 LordHdy 于 2018-11-14 21:26 编辑
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void MatrixTranspos(char* infilename, char* outfilename, unsigned long M, unsigned long N, int line)
{// 原矩阵文件名,转置矩阵文件名, 行数, 列数, 一次读取行数
ifstream in;
ofstream out;
int buffsize = N*line*3+line*2; // 缓冲区大小 列数*要读取的行数*3(一个数字占三个字符的位置)+要读取的行数(换行符)
char *Matrix = new char; // 分配缓冲区内存
in.open(infilename, ios::in|ios::binary); // 打开原矩阵文件
out.open(outfilename, ios::out|ios::app); // 打开转置矩阵文件
if(!in || !out)
{
cout << "File open error!" << endl;
return ;
}
in.read((char*)Matrix, buffsize); // 按块读取数据
in.seekg(0, in.beg);
// cout.write((char*)Matrix, buffsize); // 输出缓冲区内数据
int k = 0;
for(int i = 0; i < N; i++) // 转置
{
for(int j = 0; j < line; j++)
{
out.write((char*)Matrix+3*N*j+2*j, 3);
cout.write((char*)Matrix+3*N*j+2*j, 3);
}
out << "" << ++k << '\n';
cout << endl;
Matrix = Matrix+3;
}
delete[] Matrix;
in.close();
out.close();
}
int main()
{
char *infile = "matrix.txt";
char *outfile = "transpos.txt";
// // 创建大矩阵文件
// ofstream out;
// out.open("matrix.txt", ios::out);
//
// srand((int)time(0));
// for(int i = 0; i < 3000; i++)
// {
// for(int j = 0; j <2000; j++)
// {
// out << setw(3) << (rand()%100);// 一个数字占三个字节的位置
// }
// out << endl;
// }
// out.close();
MatrixTranspos(infile, outfile, 3000, 2000, 10);
return 0;
}
以上是我写的矩阵转置的部分代码,只是用来测试,但是有问题,控制台输出的部分矩阵转置是正确的,但是输出到文件中的矩阵少了几行,有没有哪位可以帮忙看一下怎么回事,该怎么修改呀?
主函数中注释部分是生成原矩阵的代码。 #include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void MatrixTranspos(char* infilename, char* outfilename, unsigned long M, unsigned long N, int line)
{// 原矩阵文件名,转置矩阵文件名, 行数, 列数, 一次读取行数
ifstream in;
ofstream out;
int buffsize = N*line*3+line*2; // 缓冲区大小 列数*要读取的行数*3(一个数字占三个字符的位置)+要读取的行数(换行符)
char *Matrix = new char; // 分配缓冲区内存
char *ptr = Matrix;
in.open(infilename, ios::in|ios::binary); // 打开原矩阵文件
out.open(outfilename, ios::out|ios::app); // 打开转置矩阵文件
if(!in || !out)
{
cout << "File open error!" << endl;
return ;
}
in.read((char*)Matrix, buffsize); // 按块读取数据
in.seekg(0, in.beg);
// cout.write((char*)Matrix, buffsize); // 输出缓冲区内数据
for(int i = 0; i < N; i++) // 转置
{
for(int j = 0; j < line; j++)
{
//out.write((char*)Matrix+3*N*j+2*j, 3);
//cout << ptr << ptr << ptr;
out << ptr << ptr << ptr;
//ptr = ptr+3*N*j+2*j;
//cout.write((char*)Matrix+3*N*j+2*j, 3);
}
out <<'\n';
//cout << endl;
//cout << " " << ++k << '\n';
//Matrix = Matrix+3;
//ptr = Matrix;
}
delete[] Matrix;
in.close();
out.close();
}
int main()
{
char *infile = "matrix.txt";
char *outfile = "transpos.txt";
// // 创建大矩阵文件
// ofstream out;
// out.open("matrix.txt", ios::out);
//
// srand((int)time(0));
// for(int i = 0; i < 3000; i++)
// {
// for(int j = 0; j <2000; j++)
// {
// out << setw(3) << (rand()%100);// 一个数字占三个字节的位置
// }
// out << endl;
// }
// out.close();
MatrixTranspos(infile, outfile, 3000, 2000, 10);
return 0;
}
这样输出就可以了。
谢谢大家的回复!
页:
[1]