[已解决] 提示带有下标的赋值维度不匹配,Path(t)=Lens_avg出错,该怎么修改

[复制链接]
kelejianjian 发表于 2020-11-26 20:10:36
clc;
clear all;
matrix=[1 4 1 8 2 7 1
4 1 2 3 5 2 7
1 2 1 1 4 7 1
8 3 1 1 5 9 3
2 5 4 5 1 1 1
7 2 7 9 1 1 7
1 7 1 3 1 7 1
];
Dorder=[4 6
6 4
1 4
4 1
1 6
2 7
3 6
6 1
6 3
6 7
7 2
7 6
2 5
4 5
5 2
5 4
1 2
2 1
3 5
5 3
2 4
4 2
4 7
7 4
1 5
2 3
2 6
3 2
5 1
6 2
1 1
1 3
1 7
2 2
3 1
3 3
3 4
3 7
4 3
4 4
5 5
5 6
5 7
6 5
6 6
7 1
7 3
7 5
7 7
];
[row,cell]=size(matrix);
Num=row;
A=matrix;
[row,cell]=size(A);
% for i=1:row
%     for j=1:cell
%         if A(i,j)==1
%           A(j,i)= 1;
%         end
%     end
% end
t=1;
q=1;
r=[];
Path=[];
for t=1: row   
      A(Dorder(t,1),Dorder(t,2))=0;  
    r(t)=t/size(Dorder,1);
Lens_avg=function_Path_Length(A)
   Path(t)=Lens_avg;
    t=t+1
end

最佳答案


TouAkira 发表于 2020-11-27 09:09:32
kelejianjian 发表于 2020-11-26 20:25
不好意思,这是function_Path_Length 函数:

function [Lens,Lens_avg]=function_Path_Length(matrix)

这不就是我说的"最基本的可能就是该函数的输出不是标量,导致Path(t)=Lens_avg;这种对单个元素进行赋值的语句不能执行"么?
你的自定义函数写成 [Lens,Lens_avg]=function_Path_Length(matrix)那么它的默认输出就是Lens,鉴于运算中含有 Lens(i,i) 这种写法,这个输出就是个矩阵而非标量,不能用来给单个元素进行赋值的。
你想用的第二个输出,不是写个Lens_avg做变量名、系统就知道你要调用第二个输出的,需要写成
  1. [ ~, Lens_avg ] = function_Path_Length( A )
复制代码

才行。调用时关键的是位置,而不是变量名。你自己运行一下
  1. [ Lens, Lens_avg ] = function_Path_Length( A )
  2. [ Lens_avg , Lens] = function_Path_Length( A )
复制代码

比对结果看看到底是位置还是变量名对获得输出有影响就知道了。

4 条回复


TouAkira 发表于 2020-11-26 21:50:17
你这自定义的 function_Path_Length 函数又没给出代码,别人没法测试啊。
最基本的可能就是该函数的输出不是标量,导致Path(t)=Lens_avg;这种对单个元素进行赋值的语句不能执行。

kelejianjian 发表于 2020-11-27 08:25:42
TouAkira 发表于 2020-11-26 21:50
你这自定义的 function_Path_Length 函数又没给出代码,别人没法测试啊。
最基本的可能就是该函数的输出不 ...

不好意思,这是function_Path_Length 函数:

function [Lens,Lens_avg]=function_Path_Length(matrix)
%计算平均最短路径长度
Num = size(matrix,2);
Lens   = matrix;
Lens(find(Lens==0))=inf;    %将邻接矩阵变为邻接距离矩阵,两点无边相连时赋值为inf,自身到自身的距离为0.
for i=1:Num           
     Lens(i,i)=0;      
end   
for k=1:Num            %Floyd算法求解任意两点的最短距离
     for i=1:Num
         for j=1:Num
             if Lens(i,j)>Lens(i,k)+Lens(k,j)
                Lens(i,j)=Lens(i,k)+Lens(k,j);
             end
         end
     end
end

%%%%%%%%%%%%%%%%计算效率时  下面的加百分号
%  for i=1:Num
%      for j=1:Num
%  if Lens(i,j)==inf;
%      Lens(i,j)=0;
%  end
%      end
%  end
%%%%%%%%%%%%%%%%%%%%%%%%%上面的计算网络效率时不需要
Lens_avg=sum(sum(Lens))/(Num*(Num-1));  %平均最短路径长度
if Lens_avg==inf
     disp('该网络图不是连通图');
end
end

TouAkira 发表于 2020-11-27 09:09:32
kelejianjian 发表于 2020-11-26 20:25
不好意思,这是function_Path_Length 函数:

function [Lens,Lens_avg]=function_Path_Length(matrix)

这不就是我说的"最基本的可能就是该函数的输出不是标量,导致Path(t)=Lens_avg;这种对单个元素进行赋值的语句不能执行"么?
你的自定义函数写成 [Lens,Lens_avg]=function_Path_Length(matrix)那么它的默认输出就是Lens,鉴于运算中含有 Lens(i,i) 这种写法,这个输出就是个矩阵而非标量,不能用来给单个元素进行赋值的。
你想用的第二个输出,不是写个Lens_avg做变量名、系统就知道你要调用第二个输出的,需要写成
  1. [ ~, Lens_avg ] = function_Path_Length( A )
复制代码

才行。调用时关键的是位置,而不是变量名。你自己运行一下
  1. [ Lens, Lens_avg ] = function_Path_Length( A )
  2. [ Lens_avg , Lens] = function_Path_Length( A )
复制代码

比对结果看看到底是位置还是变量名对获得输出有影响就知道了。
回复此楼

kelejianjian 发表于 2020-11-27 09:40:16
TouAkira 发表于 2020-11-27 09:09
这不就是我说的"最基本的可能就是该函数的输出不是标量,导致Path(t)=Lens_avg;这种对单个元素进行赋值的 ...

太感谢了,我也是写论文需要用到MATLAB,不是很精通,再次表示感谢:loveliness:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表