矩阵转置

问题描述 投票:0回答:1

我试图找到具有

rows
行和
cols
列的给定矩阵 A 的转置。 我的尝试:

void GetTranspose(int* a, int rows, int cols, int* tr)
{
    for (int i = 0; i < cols; i++)
    {
        for (int j = 0; j < rows; j++)
        {
            tr[i * cols + j] = a[j * rows + i];
        }
    }
}

A 的转置有

cols
行和
rows
列。这就是为什么我们想要 tr[i][j]=a[j][i]。我不明白我的错误在哪里。也许在矩阵线性化的某个地方以及我设置 tr[i][j] 的地方。

这就是我们调用和使用该函数的方式:

int a[4][3] = {
    {1, 2, 3},
    {2, 3, 5},
    {7, 7, 7},
    {4, 9, 11}
};

int tr[3][4];

GetTranspose(&a[0][0], 4, 3, &tr[0][0]);

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++)
    {
        cout << tr[i][j] << " ";
    }

    cout << endl;
}

我不明白为什么结果是:

c++ pointers multidimensional-array transpose
1个回答
0
投票

问题在于您在

GetTranspose
函数中计算转置矩阵索引的方式。正确的计算应该是
tr[i * rows + j]
而不是
tr[i * cols + j]

这是更正后的代码:

#include <iostream>
using namespace std;

void GetTranspose(int* a, int rows, int cols, int* tr)
{
    for (int i = 0; i < cols; i++)
    {
        for (int j = 0; j < rows; j++)
        {
            tr[i * rows + j] = a[j * cols + i];  // Corrected index calculation
        }
    }
}

int a[4][3] =
{
    {1, 2, 3},
    {2, 3, 5},
    {7, 7, 7},
    {4, 9, 11}
};

int main()
{
    int tr[3][4];

    GetTranspose(&a[0][0], 4, 3, &tr[0][0]);

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            cout << tr[i][j] << " ";
        }

    cout << endl;
    }
    return 0;
}

您提供的代码,不正确的索引导致元素从原始矩阵到转置矩阵的映射不正确。

进行此更改后,您的代码应该可以正常工作,并且您将获得预期的矩阵转置

a

现在,结果应该是矩阵的正确转置

a

© www.soinside.com 2019 - 2024. All rights reserved.