LordHdy 发表于 2018-11-9 08:23:45

高阶矩阵转置算法(百万阶的矩阵)

需要从文件读取矩阵,获取行数和列数,并进行转置。可能不是方阵!有没有算法的空间复杂度和时间复杂度比较好的算法啊{:10_266:}

风扫地 发表于 2018-11-9 12:00:09

本帖最后由 风扫地 于 2018-11-10 16:19 编辑

思路1.先用MATLABtextscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了,我这个主意你觉得怎么样;
思路2.先获得数据的规模,申请空间,读一个然后算对应位置(应该就交换一下下标),存入对应空间。再读一个,再存一个,直到读完,存完。
{:10_277:}

Charles未晞 发表于 2018-11-9 12:47:35

矩阵转置还有考虑是不是方阵的么。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

LordHdy 发表于 2018-11-14 21:21:03

风扫地 发表于 2018-11-9 12:00
思路1.先用MATLABtextscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了 ...

不能用matlab,老师要求自己用C++写

LordHdy 发表于 2018-11-14 21:25:14

本帖最后由 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;
}


以上是我写的矩阵转置的部分代码,只是用来测试,但是有问题,控制台输出的部分矩阵转置是正确的,但是输出到文件中的矩阵少了几行,有没有哪位可以帮忙看一下怎么回事,该怎么修改呀?
主函数中注释部分是生成原矩阵的代码。

LordHdy 发表于 2018-11-14 22:01:04

#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]
查看完整版本: 高阶矩阵转置算法(百万阶的矩阵)