1

我正在尝试使用 MATLAB 通过向量找到矩阵复合内的最大向量,但是我遇到了一些困难,所以如果有人帮助我,我将非常感激。我有这个:

矩阵路径(Dijkstra 函数的解),它是一个 1000x1000 矩阵,其值是 1 行和不同列数的向量(当列大于 10 时,值显示为“1x11 double, 1x12 double, etc ”)。矩阵路径具有以下形式:

         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]但我希望看到整个向量。我不知道该怎么办,也许是一个“for”循环,我真的不知道 MATLAB 是把矩阵的数据作为向量还是作为简单的双精度值。

4

1 回答 1

2

可以使用cellfun和找到具有最大向量的单元格,numel以获取存储在 的单元格中的每个数字矩阵中的元素数paths

vecLens = cellfun(@numel,paths);
[maxLen,im] = max(vecLens(:));
[rowMax,colMax] = ind2sub(size(vecLens),im)

vecLens这将获得一个包含大小的 1000x1000 数字矩阵,max获得最大元素的线性索引,并将其ind2sub转换为行、列索引。

关于length:它为您提供最大尺寸的大小。的大小paths是 1000x1000,1000 也是如此length(paths)。我的建议是,永远不要使用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);
于 2014-04-10T21:52:30.130 回答