鱼C论坛

 找回密码
 立即注册
查看: 2058|回复: 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 编辑
#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[buffsize];            // 分配缓冲区内存

    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;
}

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

使用道具 举报

 楼主| 发表于 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[buffsize];            // 分配缓冲区内存
    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[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];
            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];
            //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;
}

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 18:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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