我试图通过MATLAB向量找到矩阵化合物中最大的向量,但是我遇到了一些困难,所以如果有人帮助我,我会非常感激。我有这个:
矩阵路径(Dijkstra函数的解),它是一个1000x1000矩阵,其值是1行和不同列数的向量(当列大于10时,值显示为" 1x11 double,1x12 double等等#34;)。矩阵路径具有以下形式:
1 2 3 ....
1 1 <1x20 double> <1x16 double>
2 <1x20 double> 2 [2,870,183,492,641,863,611,3]
3 <1x16 double> [3,611,863,641,492,183,870,2] 3
4 <1x25 double> <1x12 double> <1x14 double>
.
.
.
起初我想通过
找到矩阵中最大的矢量B = max(length(paths))
然而,MATLAB返回B = 1000,这是可行的,但不太可能。当试图通过使用:
找出向量的位置时[row,column] = find(length(paths) == B)
MATLAB返回row = 1,column = 1,这肯定是错误的......我认为这可能是MATLAB如何获取数据的问题。它就像它没有将矩阵的条目视为向量,因为当我输入:
length(paths(3,2))
它返回1,但它应该按照我的理解返回8,同样在介绍时:
paths(3,2)
返回[1x8 double]
但我希望看到整个向量。我不知道该怎么做,也许是&#34;因为&#34;循环,我真的不知道MATLAB是否将矩阵的数据作为向量或简单的双值。
答案 0 :(得分:2)
使用cellfun
和numel
可以找到具有最大向量的单元格,以获取paths
单元格中存储的每个数字矩阵中的元素数量:
vecLens = cellfun(@numel,paths);
[maxLen,im] = max(vecLens(:));
[rowMax,colMax] = ind2sub(size(vecLens),im)
这将获得包含大小的1000x1000数字矩阵vecLens
,max
获取最大元素的线性索引,ind2sub
将其转换为行,列索引。
关于length
的说明:它给出了最大尺寸的大小。 paths
的大小为1000x1000,因此length(paths)
为1000.我的建议是,不要使用length
。使用size
,指定所需的尺寸。
如果多个向量长度相同,则使用上述方法得到第一个向量。要获得所有这些(从max
命令之后开始):
maxMask = vecLens==maxLen;
if nnz(maxMask)>1,
[rowMax,colMax] = find(maxMask);
else
[rowMax,colMax] = ind2sub(size(vecLens),im)
end
或只是
[rowMax,colMax] = find(vecLens==maxLen);