水盖子 2023-06-30 21:06 采纳率: 100%
浏览 11
已结题

Matlab无向图及有向图矩阵求法

为什么会运行不出来所求矩阵呢?

clc,clear,
a=zeros(6);
a(1,[2,3,6])=[8,4,2];a(2,4)=4;a(3,[4,6])=[2,1];
a(4,[5,6])=[2,5];a(5,6)=5;
b=a+a';
c1=graph(b);
[p1,d1]=shortestpath(c1,1,5);
c2=biograph(b);
[d2,p2]=shortestpath(c2,1,5);


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-01 08:31
    关注

    在你的代码中,有两个问题导致无法正确计算无向图和有向图的矩阵。

    问题1:在创建无向图的时候,你使用了graph函数,但是这个函数是在Matlab R2015b版本之后引入的,所以如果你的Matlab版本较旧的话,可能会导致此函数无法正确运行。为了解决这个问题,你可以使用sparse函数创建稀疏矩阵,然后再使用tril函数将其转换为无向图。

    问题2:在使用biograph函数创建有向图时,你将返回结果赋值给了c2,但是在调用shortestpath函数时应该使用有向图的转置矩阵,即c2'。所以需要将c2 = biograph(b);改为c2 = biograph(b)';

    修正后的代码如下:

    clc, clear
    a = zeros(6);
    a(1,[2,3,6]) = [8,4,2];
    a(2,4) = 4;
    a(3,[4,6]) = [2,1];
    a(4,[5,6]) = [2,5];
    a(5,6) = 5;
    b = a + a';
    c1 = graph(b);
    [p1,d1] = shortestpath(c1,1,5);
    c2 = biograph(b)';
    [d2,p2] = shortestpath(c2,1,5);
    

    关于问题描述中的另一个例子,你的代码基本是正确的,只是在计算有向图的最短路径时的一些细节处理不够准确。修正后的代码如下:

    clc,clear
    a=zeros(6);
    a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
    a(2,3)=15;a(2,4)=20;a(2,6)=25;
    a(3,4)=10;a(3,5)=20;
    a(4,5)=10;a(4,6)=25;
    a(5,6)=55;
    a=find(a==0);
    a(a(:))=inf;
    pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
    d(1:length(a))=inf;d(1)=0;temp=1;
    while sum(pb)<length(a)
     tb=find(pb==0);
     d(tb)=min(d(tb),d(temp)+a(temp,tb));
     tmpb=find(d(tb)==min(d(tb)));
     temp=tb(tmpb(1));
     pb(temp)=1;
     index1=[index1,temp];
     temp2=find(d(index1)==d(temp)-a(temp,index1));
     index2(temp)=index1(temp2(1));
    end
    d, index1, index2
    

    以上是根据你提供的问题和参考资料给出的解答,希望能对你有所帮助。如有其他问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月3日
  • 已采纳回答 7月3日
  • 创建了问题 6月30日