前几天,有人问了我个Matlab报错:“索引超出矩阵维度”的问题。问我该如何解决,看了下,涉及到了cell元胞数据的操作。大体上,某个cell数据,有几个元素是由一个小型矩阵组成的元素,可以理解为矩阵套矩阵。本文就告诉你如何处理这种矩阵套矩阵,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就是一个元胞数据,具体数据如下:
程序运行报错:
索引超出矩阵维度。 出错 main (line 45) w(i,j)=L(i,j).*sum(w(Di{i},i));
很明显当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
其中,size(Di{i},2)表示子项个数。文中算法所用到的公式如下:
cell元胞数据,可以通过大括号读取,即文中的Di{i}。表示读取Di矩阵的第i个元素。当i为5时,Di{5}(1)表示读取第五个元素的第一个子元素。大体上,就是这么个意思吧。
原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/2125.html