鱼C论坛

 找回密码
 立即注册
查看: 1859|回复: 5

[已解决]高阶矩阵转置算法(百万阶的矩阵)

[复制链接]
发表于 2018-11-9 08:23:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
需要从文件读取矩阵,获取行数和列数,并进行转置。可能不是方阵!有没有算法的空间复杂度和时间复杂度比较好的算法啊
最佳答案
2018-11-9 12:00:09
本帖最后由 风扫地 于 2018-11-10 16:19 编辑

思路1.先用MATLAB  textscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了,我这个主意你觉得怎么样;
思路2.先获得数据的规模,申请空间,读一个然后算对应位置(应该就交换一下下标),存入对应空间。再读一个,再存一个,直到读完,存完。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-9 12:00:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风扫地 于 2018-11-10 16:19 编辑

思路1.先用MATLAB  textscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了,我这个主意你觉得怎么样;
思路2.先获得数据的规模,申请空间,读一个然后算对应位置(应该就交换一下下标),存入对应空间。再读一个,再存一个,直到读完,存完。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-9 12:47:35 | 显示全部楼层
矩阵转置还有考虑是不是方阵的么。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 21:21:03 | 显示全部楼层
风扫地 发表于 2018-11-9 12:00
思路1.先用MATLAB  textscan出来,然后transpose一下,再写进新的文件,要数据的话就从新文件里面读就可以了 ...

不能用matlab,老师要求自己用C++写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 21:25:14 | 显示全部楼层
本帖最后由 LordHdy 于 2018-11-14 21:26 编辑
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdlib.h>
  4. #include <time.h>

  5. using namespace std;

  6. void MatrixTranspos(char* infilename, char* outfilename, unsigned long M, unsigned long N, int line)
  7. {// 原矩阵文件名,  转置矩阵文件名, 行数, 列数, 一次读取行数

  8.     ifstream in;
  9.     ofstream out;

  10.     int buffsize = N*line*3+line*2;               // 缓冲区大小 列数*要读取的行数*3(一个数字占三个字符的位置)+要读取的行数(换行符)
  11.     char *Matrix = new char[buffsize];            // 分配缓冲区内存

  12.     in.open(infilename, ios::in|ios::binary);     // 打开原矩阵文件
  13.     out.open(outfilename, ios::out|ios::app);              // 打开转置矩阵文件
  14.     if(!in || !out)
  15.     {
  16.         cout << "File open error!" << endl;
  17.         return ;
  18.     }

  19.     in.read((char*)Matrix, buffsize);                  // 按块读取数据
  20.     in.seekg(0, in.beg);
  21. //    cout.write((char*)Matrix, buffsize);             // 输出缓冲区内数据
  22. int k = 0;
  23.     for(int i = 0; i < N; i++)                         // 转置
  24.     {
  25.         for(int j = 0; j < line; j++)
  26.         {
  27.             out.write((char*)Matrix+3*N*j+2*j, 3);
  28.             cout.write((char*)Matrix+3*N*j+2*j, 3);
  29.         }
  30.         out << "  " << ++k << '\n';
  31.         cout << endl;
  32.         Matrix = Matrix+3;
  33.     }

  34.     delete[] Matrix;
  35.     in.close();
  36.     out.close();

  37. }

  38. int main()
  39. {
  40.     char *infile = "matrix.txt";
  41.     char *outfile = "transpos.txt";

  42. //    // 创建大矩阵文件
  43. //    ofstream out;
  44. //    out.open("matrix.txt", ios::out);
  45. //
  46. //    srand((int)time(0));
  47. //    for(int i = 0; i < 3000; i++)
  48. //    {
  49. //        for(int j = 0; j <2000; j++)
  50. //        {
  51. //            out << setw(3) << (rand()%100);  // 一个数字占三个字节的位置
  52. //        }
  53. //        out << endl;
  54. //    }
  55. //    out.close();

  56.     MatrixTranspos(infile, outfile, 3000, 2000, 10);


  57.     return 0;
  58. }
复制代码


以上是我写的矩阵转置的部分代码,只是用来测试,但是有问题,控制台输出的部分矩阵转置是正确的,但是输出到文件中的矩阵少了几行,有没有哪位可以帮忙看一下怎么回事,该怎么修改呀?
主函数中注释部分是生成原矩阵的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 22:01:04 | 显示全部楼层
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdlib.h>
  4. #include <time.h>

  5. using namespace std;

  6. void MatrixTranspos(char* infilename, char* outfilename, unsigned long M, unsigned long N, int line)
  7. {// 原矩阵文件名,  转置矩阵文件名, 行数, 列数, 一次读取行数

  8.     ifstream in;
  9.     ofstream out;

  10.     int buffsize = N*line*3+line*2;               // 缓冲区大小 列数*要读取的行数*3(一个数字占三个字符的位置)+要读取的行数(换行符)
  11.     char *Matrix = new char[buffsize];            // 分配缓冲区内存
  12.     char *ptr = Matrix;

  13.     in.open(infilename, ios::in|ios::binary);     // 打开原矩阵文件
  14.     out.open(outfilename, ios::out|ios::app);              // 打开转置矩阵文件
  15.     if(!in || !out)
  16.     {
  17.         cout << "File open error!" << endl;
  18.         return ;
  19.     }

  20.     in.read((char*)Matrix, buffsize);                  // 按块读取数据
  21.     in.seekg(0, in.beg);
  22. //    cout.write((char*)Matrix, buffsize);             // 输出缓冲区内数据

  23.     for(int i = 0; i < N; i++)                         // 转置
  24.     {
  25.         for(int j = 0; j < line; j++)
  26.         {
  27.             //out.write((char*)Matrix+3*N*j+2*j, 3);
  28.             //cout << ptr[3*i+3*N*j+2*j] << ptr[3*i+3*N*j+2*j+1] << ptr[3*i+3*N*j+2*j+2];
  29.             out << ptr[3*i+3*N*j+2*j] << ptr[3*i+3*N*j+2*j+1] << ptr[3*i+3*N*j+2*j+2];
  30.             //ptr = ptr+3*N*j+2*j;
  31.             //cout.write((char*)Matrix+3*N*j+2*j, 3);
  32.         }
  33.         out <<'\n';
  34.         //cout << endl;
  35.         //cout << "   " << ++k << '\n';
  36.         //Matrix = Matrix+3;
  37.         //ptr = Matrix;
  38.     }

  39.     delete[] Matrix;
  40.     in.close();
  41.     out.close();

  42. }

  43. int main()
  44. {
  45.     char *infile = "matrix.txt";
  46.     char *outfile = "transpos.txt";

  47. //    // 创建大矩阵文件
  48. //    ofstream out;
  49. //    out.open("matrix.txt", ios::out);
  50. //
  51. //    srand((int)time(0));
  52. //    for(int i = 0; i < 3000; i++)
  53. //    {
  54. //        for(int j = 0; j <2000; j++)
  55. //        {
  56. //            out << setw(3) << (rand()%100);  // 一个数字占三个字节的位置
  57. //        }
  58. //        out << endl;
  59. //    }
  60. //    out.close();

  61.     MatrixTranspos(infile, outfile, 3000, 2000, 10);


  62.     return 0;
  63. }
复制代码


这样输出就可以了。
谢谢大家的回复!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 20:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表