Ошибка конкатенации массива ячеек в Matlab при комментировании определенных строк

Я пытаюсь создать массив ячеек из массивов ячеек в Matlab. Код, который у меня сейчас есть, работает именно так, как мне нужно. Проблема в основном в том, что если я закомментирую любую строку, которая не является первой, средней или последней, я получаю сообщение об ошибке:

Ошибка при использовании аргументов CAT ==> vertcat. Размеры несовместимы.

Я изучал это некоторое время, и я нашел еще одного человека с точно такой же проблемой...

http://www.programmersheaven.com/mb/ctocplusplustomatlab/424275/424275/mysterious-reason-for-cat-error-when-defining-cell-array/

... однако для этого поста нет решения.

Вот мой код (4 обозначают возможные целые значения переменных):

cell = {{4} ...
    {4} ...
    {4} ...
    {4} ...
    {} ...
    {4} ...
    {4} ...
    {4} ...
    {4} ...
    {4 4 4 4} ...
    {4} ...
    {4} ...
    {4} ...
    {4} ...
    {4} ...
    {4 4 4 4} ...
    {5} ...
    {} ...
    {4} ...
    {4} ...
    {} ...
    {} ...
    {} ...
    {} ...
    {} ...
    {} ...
    {} ...
    {} ...
    {} ...
    };

(Я не могу заставить его выглядеть здесь точно так же... после каждого эллипса код переходит на новую строку в моей версии)

Допустим, я закомментировал строку с цифрой 5. Он всегда будет возвращать ошибку конкатенации. Любая идея, почему это происходит?

Заранее спасибо,

Николь


person Nicole Ouellette    schedule 21.06.2012    source источник


Ответы (2)


Вот меньший пример:

c = {...
    {1}... % you can comment out this line
    {2}... % error when commenting this line
    {3}... % you can comment this line (will make a 2-by-2 array)
    {4}... % error when commenting this line
    {5}... % you can comment out this line
    }

Закомментированная строка будет считаться пустой строкой в ​​Matlab. При катенации одна (или несколько) пустая строка эквивалентна точке с запятой, которая указывала бы на начало новой строки.

Как следствие,

c = {{1} {2}

     {3} {4}}

приводит к массиву 2 на 2 и эквивалентен

c = {{1},{2};{3},{4}}

Когда ставишь точку с запятой после каждой строки

c = {...
    {1};... 
    {2};... 
    {3};... 
    {4};...
    {5};... 
    }

любая закомментированная строка будет эквивалентна точке с запятой, а поскольку несколько точек с запятой допустимы (работает c = {{1};;{2};}), теперь вы можете закомментировать любое количество строк.

Обратите внимание, что выход теперь представляет собой массив n-by-1 вместо 1-by-n, и вам не следует называть его cell, так как это имя встроенной функции.

person Jonas    schedule 21.06.2012
comment
Есть ли способ заставить его быть 1 на n? Я не хочу переделывать индексацию, которую я делаю позже в коде, если только мне это абсолютно не нужно (их много). - person Nicole Ouellette; 21.06.2012
comment
Чтобы сделать его 1 на n, вы можете просто транспонировать массив после создания: c = c';. Однако, если все, что вы делаете, это индексируете как c{i}, а не c{1,i}, у вас все будет хорошо даже без транспонирования. - person Jonas; 21.06.2012

Matlab интерпретирует закомментированную строку как новую строку. Попробуйте поместить пустую строку между ячейками, и вы должны увидеть ту же ошибку. Вы можете избежать ошибки, если поставите точку с запятой после каждой из ячеек.

person ioums    schedule 21.06.2012
comment
Мне было интересно, о чем думает Matlab! Большое спасибо! Ваше решение сработало как шарм! - person Nicole Ouellette; 21.06.2012