2013-11-14 4 views
1

у меня есть матрицаAppend вектора к матрице

DataSet(1000,400) 

Я желаю, чтобы скопировать каждую строку в окончательную матрицу первоначально объявленной как

FinalDataSet=[] 

Правило я следовал для копирования является следующим, который основан на пользовательский ввод

For any row i in "DataSet" 
     if user enters a character X 
      Add to FinalDataSet the vector (X,All Elements of DataSet(i)) 
     else do nothing 

Я реализовал следующий код для приведенных выше

n=size(DataSet,1); 
for i=1:n 
    element=inputdlg('Enter Character'); 
    if(~isempty(element)) 
      FinalDataSet=[FinalDataSet;[element DataSet(i,:)]]; 
    end 
end 

(диалоговое окно ввода, так как я заметил, возвращается [] если отмените нажимается)

Однако, когда я выполняю приведенный выше код FinalDataSet имеет следующий вид

'H' [1x400 double] 
'g' [1x400 double] 
'i' [1x400 double] 

Что проблема Вот? Это потому, что я пытаюсь объединить два разных типа векторов? Как я могу получить матрицу размера (1000,401), а не матрицу (1000,2)?

Я чувствую, что мне нужно либо сохранить соответствующие значения ASCII для символов, либо управлять отдельным вектором для выбора пользователя в целом. Однако возможно ли это без вышеуказанных двух методов? Пожалуйста помоги!!

ответ

1

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

Если вы действительно хотите этого, решение просто хранить все в массиве 1000x401 клеток следующим образом:

c = ['H' num2cell(1:10)] 

Однако тогда вы дали бы довольно много из удобства/эффективности вы получаете от матрицы обработки.

Поэтому я предлагаю эту альтернативу:

Если вы довольствуются хранения символа в виде числа, вот что вы можете сделать:

element = {'H'} % inputdlg returns a 1x1 cell 
i=1; 
DataSet = rand(1000,400); 

v = [element{1}+0 DataSet(i,:)] 

Чтобы потом посмотреть, какие письма он есть, вы можете использование char:

char(v(1)) 
+0

Ну ... Этот вид решает мою цель ... Спасибо! Посмотрим, есть ли у кого-то еще что-то сказать .. :) – alphacentauri

0

Другая возможность - использовать конструкции. Вы можете добавлять буквы за именем своей структуры, чтобы найти соответствующие массивы. Все массивы, размещенные в разных точках структуры, могут различаться по размеру и не обязательно должны быть того же размера, что и у вас. Вот это реализовано в коде:

n=size(DataSet,1); 
for i=1:n 
    element=inputdlg('Enter Character'); 

    if(~isempty(element)) 
     FinalDataSet.element=DataSet(i,:) 
    end 
end 

Считывание данных из вашей структуры осуществляется вызовом структуры с соответствующим элементом, давайте использовать х для примера здесь.

xdata = FinalDataSet.x; 

Что нужно, чтобы быть осторожным, не использует элемент дважды, потому что вы перезапишете предыдущие данные. Или выполните проверку, если элемент уже присутствует в массиве и предупреждает вас. Надеюсь это поможет.

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