#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
using namespace std;
struct TriTuple
{
int row;
int col;
int value;
TriTuple(){};
TriTuple(int row, int col, int value) : row(row), col(col), value(value) {}
};
int Matrix[4][4] = {
{1, 0, 0, 2},
{2, 3, 0, 0},
{0, 7, 4, 0},
{0, 6, 0, 5}};
static int row_sies[4] = {0, 0, 0, 0};
int *Makerows()
{
int len = sizeof(Matrix) / sizeof(Matrix[0]);
for (int i = 0; i < len; i++)
{
for (int j = 0; j < 4; j++)
{
if (Matrix[j][i] != 0)
row_sies[i]++;
}
}
return row_sies;
}
static int iterator_positions[4] = {0, 0, 0, 0};
int *MakeIterator()
{
for (int i = 1; i < 4; i++)
{
iterator_positions[i] = iterator_positions[i - 1] + row_sies[i - 1];
}
return iterator_positions;
}
void FastTranspose()
{
TriTuple elements[8] = {
TriTuple(0, 0, 1),
TriTuple(0, 3, 2),
TriTuple(1, 0, 2),
TriTuple(1, 1, 3),
TriTuple(2, 1, 7),
TriTuple(2, 2, 4),
TriTuple(3, 1, 6),
TriTuple(3, 3, 5)};
TriTuple tmp = elements[0];
TriTuple *T_elements = new TriTuple[8];
for (int i = 0; i < 8; i++)
{
int row = elements[i].col; // 根据原elements的列获得转置的行
int x = elements[i].col;
elements[i].col = elements[i].row;
elements[i].row = x;
T_elements[iterator_positions[row]] = elements[i];
iterator_positions[row]++;
}
for (int i = 0; i < 8; i++)
{
cout << T_elements[i].row << "\t"
<< T_elements[i].col << "\t"
<< T_elements[i].value << endl;
}
}
int main()
{
int *row_sies = Makerows();
int *iterator_positions = MakeIterator();
FastTranspose();
}
稀疏矩阵快速转置
于 2024-04-05 09:09:02 首次发布