2012-06-21 2 views
3

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

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

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

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

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

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

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 в ней. Он всегда будет возвращать ошибку конкатенации. Любая идея, почему это происходит?

Спасибо заранее,

Николь

ответ

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. При catenating одна (или несколько) пустая строка эквивалентна точке с запятой, что указывает на начало новой строки.

Следовательно,

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, так как это имя встроенной функции.

+0

Есть ли способ заставить его быть 1 на n? Я не хочу переделывать индексирование, которое я делаю позже в коде, если только мне это не нужно (его много). –

+0

Чтобы сделать это 1-by-n, вы можете просто перенести массив после создания: 'c = c ';'.Однако, если все, что вы делаете, индексируется как 'c {i}', а не 'c {1, i}', вы будете в порядке даже без транспонирования. – Jonas

+0

Отлично, большое вам спасибо! –

2

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

+0

Мне было интересно, что Матлаб «думал»! Спасибо огромное! Ваше решение работало как шарм! –

Смежные вопросы