微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C语言中稀疏矩阵的转置

如何解决C语言中稀疏矩阵的转置

我一直试图编写一个程序,该程序显示稀疏矩阵并找到矩阵的转置,但是在转置时,仅原始矩阵第一行的元素被转置,而其他所有其他元素行被忽略。我需要一些帮助。

这是我编写的代码

#include <stdio.h>
#include <stdlib.h>

struct Element{
    int i;
    int j;
    int x;
};

struct Sparse{
    int m;
    int n;
    int num;
    struct Element *ele;
};

void create(struct Sparse *s){
    printf("Enter the dimensions ");
    scanf("%d%d",&s->m,&s->n );
    printf("Number of non-zero elements");
    scanf("%d",&s->num);
    s-> ele= (struct Element*) malloc(s->num * sizeof(struct Element));
    printf("Enter all non-zero elements\n");
    for (int i = 0; i< s->num; i++)
    {
        scanf("%d%d%d",&s->ele[i].i,&s->ele[i].j,&s->ele[i].x);
    }
}
void display(struct Sparse s){
    int i,j,k=0;
    for (i = 0; i < s.m; i++)
    {
        for (j = 0; j < s.n; j++)
        {
            if(i==s.ele[k].i && j== s.ele[k].j)
                printf("%d ",s.ele[k++].x);
            else
                printf("0 ");
        }
        printf(" \n");
    }
}
void createTranspose(struct Sparse *t,struct Sparse s){
    t->m = s.n;
    t->n = s.m;
    t->num = s.num;
    t-> ele= (struct Element*) malloc(t->num * sizeof(struct Element));
    printf("Enter all non-zero elements\n");
    for (int i = 0; i< t->num; i++)
    {
        t->ele[i].i= s.ele[i].j;
        t->ele[i].j= s.ele[i].i;
        t->ele[i].x= s.ele[i].x;
    }
}

int main(){
    struct Sparse s,t;
    create(&s);
    display(s);
    createTranspose(&t,s);
    printf("Transpose of the matrix is \n");
    display(t);
    return 0;
}

输出

Enter the dimensions 6 6
Number of non-zero elements6
Enter all non-zero elements
0 0 1
0 2 2
0 4 3
2 3 4
4 1 5
5 5 6
1 0 2 0 3 0
0 0 0 0 0 0
0 0 0 4 0 0
0 0 0 0 0 0
0 5 0 0 0 0
0 0 0 0 0 6
Enter all non-zero elements
Transpose of the matrix is
1 0 0 0 0 0
0 0 0 0 0 0
2 0 0 0 0 0
0 0 0 0 0 0
3 0 0 0 0 0
0 0 0 0 0 0

对获得适当输出的一些帮助将不胜感激。

解决方法

您的显示函数假定稀疏元素按row-major顺序排列,但是经过简单的转置后,它们现在按列优先排列。

您需要重新排序保留行优先顺序的稀疏元素,或者在显示例程中需要一个内部循环:

HttpHost proxy = new HttpHost("PROXY_SERVER",PORT);
String res = Executor.newInstance()
            .auth(proxy,"USER_NAME","PASSWORD")
            .execute(Request.Get("https://example.com").viaProxy(proxy))
            .returnContent().asString();
System.out.println(res);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。