稀疏矩阵转置 java代码,稀疏矩阵的转置

稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律

如下图所示:

b5e439eac1041d78bbbcbc347b220cc7.png

spacer.gif

一般情况下,我们会想到只要交换对应的行和列,但是这种做法很浪费时间和空间,所以我们可以利用三元组进行存储,压缩存储极少数的有效数据,使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。

a9d9ab7db2ba4b306bf510cf60e1e2cd.png#define _CRT_SECURE_NO_WARNINGS 1

#pragma once

#include

#include

using namespace std;

template

struct Triple  //定义三元组

{

int _row;

int _col;

T  _value;

Triple(int row, int col, T& value)

:_row(row)

, _col(col)

, _value(value)

{}

Triple()

:_row(0)

, _col(0)

, _value(0)

{}

};

template

class SparseMatrix

{

public:

SparseMatrix(T* a, int m, int n, const T& invalid)//invalid为非法值

:_rowsize(m)

, _colsize(n)

, _invaild(invalid)

{

for (int i = 0; i 

{

for (int j = 0; j 

{

if (a[i*n + j] != invalid)

{

Triple tmp(i, j, a[i*n + j]);

_a.push_back(tmp);

}

}

}

}

SparseMatrix(size_t rowsize, size_t colsize, T invaild)

:_rowsize(rowsize),

_colsize(colsize),

_invaild(invaild)

{}

void display(T* a, int m, int n, const T& invalid)  //打印稀疏矩阵

{

int p = 0;

for (int i = 0; i 

{

for (int j = 0; j 

{

if (p 

{

cout <

p++;

}

else

{

cout <

}

}

cout <

}

}

SparseMatrix Transport()  //逆转矩阵

{ //务必保持行优先

SparseMatrix sm(_colsize, _rowsize, _invaild);

for (size_t i = 0; i 

{

size_t index = 0;

while (index 

{

if (_a[index]._col == i)

{

Triple mm;

mm._col = _a[index]._row;

mm._row = _a[index]._col;

mm._value = _a[index]._value;

sm._a.push_back(mm);

}

++index;

}

}

return sm;

}

SparseMatrix FastTransport()   //快速转置

{

SparseMatrix temp;

temp._a.resize(_a.size());

int* rowcounts = new int[_col];

int* rowstarts = new int[_col];

memset(rowcounts, 0, sizeof((int)*_col));

memset(rowstarts, 0, sizeof((int)*_col));

size_t index = 0;

while (index 

{

rowcounts[_a[index]._col]++;

++index;

}

rowstarts[0] = 0;

for (size_t i = 0; i 

{

rowstarts[i] = rowstarts[i - 1] + rowcounts[i - 1];

}

while (index 

{

size_t& begin = rowstarts[_a[index]._col];

Triple tp;

tp._row = _a[index]._col;

tp._col = _a[index]._row;

tp._value = _a[index]._value;

tmp._a[rowstarts++] = tp;

++index;

}

delete[] _a;

return tmp;

}

protected:

size_t _rowsize;

size_t _colsize;

T _invaild;

vector> _a;

};

测试代码如下:

void test()

{

int a[6][5] =

{

{ 1, 0, 3, 0, 5 },

{ 0, 0, 0, 0, 0 },

{ 0, 0, 0, 0, 0 },

{ 2, 0, 4, 0, 6 },

{ 0, 0, 0, 0, 0 },

{ 0, 0, 0, 0, 0 }

};

SparseMatrix d((int*)a, 6, 5, 0);

SparseMatrix tmp = d.Transport();

cout <

d.display((int*)a, 6, 5, 0);

cout <

cout <

tmp.display((int*)a, 5, 6, 0);

}

int main()

{

test();

system("pause");

return 0;

}

运行结果如下:

86534261d94a54fef4e261e512b4549b.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值