Нахождение наибольшего вектора внутри матрицы

Я пытаюсь найти самый большой вектор внутри матричного соединения по векторам с помощью MATLAB, однако у меня возникают некоторые трудности, поэтому я был бы очень благодарен, если бы кто-нибудь мне помог. У меня есть это:

Матричные пути (решение функции Дейкстры), представляющие собой матрицу 1000x1000, значениями которой являются векторы из 1 строки и разного количества столбцов (когда столбцов больше 10, значения отображаются как «1x11 double, 1x12 double и т. д.). "). Пути матрицы имеют следующий вид:

         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 возвращает строку = 1, столбец = 1, что, безусловно, неверно... Я подумал, что, возможно, это проблема того, как MATLAB берет данные. Как будто он не рассматривает элементы матрицы как векторы, потому что когда я ввожу:

   length(paths(3,2))

Он возвращает мне 1, но он должен вернуть 8, как я понимаю, также при введении:

    paths(3,2)

Он возвращает [1x8 double], но я ожидаю увидеть весь вектор. Я не знаю, что делать, может быть, цикл «для», я действительно не знаю, принимает ли MATLAB данные матрицы как векторы или как простые двойные значения.


person Alexff10    schedule 10.04.2014    source источник
comment
что вы получаете, когда запускаете class(paths) ?   -  person bla    schedule 11.04.2014
comment
ячейки, Итак, это матрица ячеек.. но вроде как удваивает значения.   -  person Alexff10    schedule 11.04.2014


Ответы (1)


Ячейку с наибольшим вектором можно найти, используя 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);
person chappjc    schedule 10.04.2014
comment
Я бы также объяснил, что функция numel дает количество элементов матрицы. Когда вы вызываете его с помощью cellfun, он будет вызывать numel для каждой матрицы внутри массива ячеек paths. Результатом будет матрица 1000x1000, где vecLens(r,c) содержит длину пути в paths(r,c). - person Rafael Monteiro; 11.04.2014
comment
@RafaelMonteiro Спасибо за предложения. Обновлено. - person chappjc; 11.04.2014
comment
Спасибо вам обоим, ваши ответы очень полезны :D - person Alexff10; 11.04.2014
comment
Хороший совет о length! +1 - person Luis Mendo; 11.04.2014
comment
@user2822577 user2822577 Также обратите внимание, что если есть несколько ячеек с одинаковой наибольшей длиной, первое решение просто дает первый экземпляр. Чтобы получить все, см. добавленное решение в моем ответе. - person chappjc; 11.04.2014
comment
Да, в этом случае есть только одно решение, но оно очень полезное, я рад, что есть такие люди, как вы на свете ;) - person Alexff10; 11.04.2014