Matlab cell元胞数据读取方法实例讲解

4.3
(3)

前几天,有人问了我个Matlab报错:“索引超出矩阵维度”的问题。问我该如何解决,看了下,涉及到了cell元胞数据的操作。大体上,某个cell数据,有几个元素是由一个小型矩阵组成的元素,可以理解为矩阵套矩阵。本文就告诉你如何处理这种矩阵套矩阵,cell元胞数据读取的方法。

Matlab cell元胞数据读取方法实例讲解

本文出现的程序,均经过提问者授权发布!每条程序都是截取一小段,用于实例展示。

部分源程序

for i=1:destination
    for j=1:destination
    if i==origin
        w(i,j)=L(i,j);
    else
        w(i,j)=L(i,j).*sum(w(Di{i},i));
    end 
    end
end

如上,Di就是一个元胞数据,具体数据如下:

Matlab cell元胞数据读取方法实例讲解

程序运行报错:

索引超出矩阵维度。

出错 main (line 45)
        w(i,j)=L(i,j).*sum(w(Di{i},i));
Matlab cell元胞数据读取方法实例讲解

很明显当i为5,8,9时,Di{i}为一个矩阵。我们需要对每一个子矩阵的元素进行求和。可以确认的是,当i为5 8 9时,程序报错,求和超过了矩阵维度。

问题解决

下面,我们来把cell元胞数据中存在多个元素组成矩阵的情况展开计算,分开求和,程序如下:

for i=1:destination
    for j=1:destination
    if i==origin
        w(i,j)=L(i,j);
    else
        if size(Di{i},2)==1  
            w(i,j)=L(i,j)*sum(w(Di{i},i));
        elseif size(Di{i},2)==2           
            w(i,j)=L(i,j)*sum(w(Di{i}(1),i))+L(i,j)*sum(w(Di{i}(2),i));
        elseif size(Di{i},2)==3          
            w(i,j)=L(i,j)*sum(w(Di{i}(1),i))+L(i,j)*sum(w(Di{i}(2),i))+L(i,j)*sum(w(Di{i}(3),i));
        end
    end 
    end
end

如此,我们利用size(Di{i},2),判断元胞数据子元素个数,来判断是否需要分开求和,并将Di元胞每一项的子项与L求和。最终,解决了问题。但,考虑到后期实际应用中,数据可能过多,无法像这样用if判断子项个数。我们直接用sum函数简化上述程序,最终的程序如下:

for i=1:destination
    for j=1:destination
    if i==origin
        w(i,j)=L(i,j);
    else
         w(i,j)=L(i,j)*sum(sum(w(Di{i},i)),size(Di{i},2))
    end 
    end
end
Matlab cell元胞数据读取方法实例讲解

其中,size(Di{i},2)表示子项个数。文中算法所用到的公式如下:

Matlab cell元胞数据读取方法实例讲解

cell元胞数据,可以通过大括号读取,即文中的Di{i}。表示读取Di矩阵的第i个元素。当i为5时,Di{5}(1)表示读取第五个元素的第一个子元素。大体上,就是这么个意思吧。

共计3人评分,平均4.3

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/program/matlab-cell-fixbug.html

发表评论

登录后才能评论
本站APP
本站APP
分享本页
返回顶部